http request to cgi python script successful, but the script doesn't seem to run
- by chipChocolate.py
I have configured cgi scripts for my apache2 web server.
Here is what I want to do:
Client uploads the image to the server. (this already works)
On success, I want to execute the python script to resize the image.
I tried the following and the success function does execute but my python script does not seem to execute:
Javascript code that sends the request:
var input = document.getElementById('imageLoader');
imageName = input.value;
var file = input.files[0];
if(file != undefined){
formData= new FormData();
console.log(formData.length);
if(!!file.type.match(/image.*/)){
formData.append("image", file);
$.ajax({
url: "upload.php",
type: "POST",
processData: false,
contentType: false,
success: function() {
var input = document.getElementById('imageLoader');
imageName = input.value;
var file = input.files[0];
formData = new FormData();
formData.append("filename", file);
$.ajax({
url: "http://localhost/Main/cgi-bin/resize.py",
type: "POST",
data: formData,
processData: false,
contentType: false,
success: function(data) {
console.log(data);
}
});
// code continues...
resize.py:
#!/usr/bin/python
import cgi
import cgitb
import Image
cgitb.enable()
data = cgi.FieldStorage()
filename = data.getvalue("filename")
im = Image.open("../JS/upload/" + filename)
(width, height) = im.size
maxWidth = 600
maxHeight = 400
if width > maxWidth:
d = float(width) / maxWidth
height = int(height / d)
width = maxWidth
if height > maxHeight:
d = float(height) / maxHeight
width = int(width / d)
height = maxHeight
size = (width, height)
im = im.resize(size, Image.ANTIALIAS)
im.save("../JS/upload/" + filename, quality=100)
This is the apache2.conf:
<Directory /var/www/html/Main/cgi-bin>
AllowOverride None
Options +ExecCGI
SetHandler cgi-script
AddHandler cgi-script .py .cgi
Order allow,deny
Allow from all
</Directory>
cgi-bin and python script file permissions:
drwxrwxr-x 2 mou mou 4096 Aug 24 03:28 cgi-bin
-rwxrwxrwx 1 mou mou 1673 Aug 24 03:28 resize.py
Edit:
Executing this code
$.ajax({
url: "http://localhost/Main/cgi-bin/resize.py",
type: "POST",
data: formData, // formData = {"filename" : "the filename which was saved in a variable whie the image was uploaded"}
processData: false,
contentType: false,
success: function(data) {
alert(data);
}
});
it alerts the following:
<body bgcolor="#f0f0f8"><font color="#f0f0f8" size="-5"> -->
<body bgcolor="#f0f0f8"><font color="#f0f0f8" size="-5"> --> -->
</font> </font> </font> </script> </object> </blockquote> </pre>
</table> </table> </table> </table> </table> </font> </font> </font><body bgcolor="#f0f0f8">
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#6622aa">
<td valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><type 'exceptions.TypeError'></strong></big></big></font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial">Python 2.7.6: /usr/bin/python<br>Sun Aug 24 17:24:15 2014</font></td></tr></table>
<p>A problem occurred in a Python script. Here is the sequence of
function calls leading up to the error, in the order they occurred.</p>
<table width="100%" cellspacing=0 cellpadding=0 border=0>
<tr><td bgcolor="#d8bbff"><big> </big><a href="file:///var/www/html/Main/cgi-bin/resize.py">/var/www/html/Main/cgi-bin/resize.py</a> in <strong><module></strong>()</td></tr>
<tr><td><font color="#909090"><tt> <small> 10</small> <br>
</tt></font></td></tr>
<tr><td><font color="#909090"><tt> <small> 11</small> filename = data.getvalue("filename")<br>
</tt></font></td></tr>
<tr><td bgcolor="#ffccee"><tt>=><small> 12</small> im = Image.open("../JS/upload/" + filename)<br>
</tt></td></tr>
<tr><td><font color="#909090"><tt> <small> 13</small> <br>
</tt></font></td></tr>
<tr><td><font color="#909090"><tt> <small> 14</small> (width, height) = im.size<br>
</tt></font></td></tr>
<tr><td><small><font color="#909090">im <em>undefined</em>, <strong>Image</strong> = <module 'Image' from '/usr/lib/python2.7/dist-packages/PILcompat/Image.pyc'>, Image.<strong>open</strong> = <function open>, <strong>filename</strong> = '<font color="#c040c0">\xff\xd8\xff\xe0\x00\x10</font>JFIF<font color="#c040c0">\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00</font>C<font color="#c040c0">\x00\x06\x04\x05\x06\x05\x04\x06\x06\x05\x06\x07\x07\x06\x08\n\x10\n\n\t\t\n\x14\x0e</font>...<font color="#c040c0">\x94\r\x17\x11</font>b<font color="#c040c0">\xcd\xdc\x1a\xfe\xf1\x05\x1b\x15\xd1</font>R<font color="#c040c0">\xce\xe9</font>*<font color="#c040c0">\xb5\x8e</font>b<font color="#c040c0">\x97\x82\x87</font>R<font color="#c040c0">\xf4\xaa</font>K<font color="#c040c0">\x83</font>6<font color="#c040c0">\xbf\xfb</font>0<font color="#c040c0">\xa0\xb6</font>8<font color="#c040c0">\xa9</font>C<font color="#c040c0">\x86\x8d\x96</font>n+E<font color="#c040c0">\xd3\x7f\x99\xff\xd9</font>'</font></small></td></tr></table>
<table width="100%" cellspacing=0 cellpadding=0 border=0>
<tr><td bgcolor="#d8bbff"><big> </big><a href="file:///usr/lib/python2.7/dist-packages/PIL/Image.py">/usr/lib/python2.7/dist-packages/PIL/Image.py</a> in <strong>open</strong>(fp='../JS/upload/<font color="#c040c0">\xff\xd8\xff\xe0\x00\x10</font>JFIF<font color="#c040c0">\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00</font>C<font color="#c040c0">\x00\x06\x04\x05\x06\x05\x04\x06\x06\x05\x06</font>...<font color="#c040c0">\x94\r\x17\x11</font>b<font color="#c040c0">\xcd\xdc\x1a\xfe\xf1\x05\x1b\x15\xd1</font>R<font color="#c040c0">\xce\xe9</font>*<font color="#c040c0">\xb5\x8e</font>b<font color="#c040c0">\x97\x82\x87</font>R<font color="#c040c0">\xf4\xaa</font>K<font color="#c040c0">\x83</font>6<font color="#c040c0">\xbf\xfb</font>0<font color="#c040c0">\xa0\xb6</font>8<font color="#c040c0">\xa9</font>C<font color="#c040c0">\x86\x8d\x96</font>n+E<font color="#c040c0">\xd3\x7f\x99\xff\xd9</font>', mode='r')</td></tr>
<tr><td><font color="#909090"><tt> <small> 1994</small> if isPath(fp):<br>
</tt></font></td></tr>
<tr><td><font color="#909090"><tt> <small> 1995</small> filename = fp<br>
</tt></font></td></tr>
<tr><td bgcolor="#ffccee"><tt>=><small> 1996</small> fp = builtins.open(fp, "rb")<br>
</tt></td></tr>
<tr><td><font color="#909090"><tt> <small> 1997</small> else:<br>
</tt></font></td></tr>
<tr><td><font color="#909090"><tt> <small> 1998</small> filename = ""<br>
</tt></font></td></tr>
<tr><td><small><font color="#909090"><strong>fp</strong> = '../JS/upload/<font color="#c040c0">\xff\xd8\xff\xe0\x00\x10</font>JFIF<font color="#c040c0">\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00</font>C<font color="#c040c0">\x00\x06\x04\x05\x06\x05\x04\x06\x06\x05\x06</font>...<font color="#c040c0">\x94\r\x17\x11</font>b<font color="#c040c0">\xcd\xdc\x1a\xfe\xf1\x05\x1b\x15\xd1</font>R<font color="#c040c0">\xce\xe9</font>*<font color="#c040c0">\xb5\x8e</font>b<font color="#c040c0">\x97\x82\x87</font>R<font color="#c040c0">\xf4\xaa</font>K<font color="#c040c0">\x83</font>6<font color="#c040c0">\xbf\xfb</font>0<font color="#c040c0">\xa0\xb6</font>8<font color="#c040c0">\xa9</font>C<font color="#c040c0">\x86\x8d\x96</font>n+E<font color="#c040c0">\xd3\x7f\x99\xff\xd9</font>', <em>global</em> <strong>builtins</strong> = <module '__builtin__' (built-in)>, builtins.<strong>open</strong> = <built-in function open></font></small></td></tr></table><p><strong><type 'exceptions.TypeError'></strong>: file() argument 1 must be encoded string without NULL bytes, not str
<br><tt><small> </small> </tt>args =
('file() argument 1 must be encoded string without NULL bytes, not str',)
<br><tt><small> </small> </tt>message =
'file() argument 1 must be encoded string without NULL bytes, not str'
<!-- The above is a description of an error in a Python program, formatted
for a Web browser because the 'cgitb' module was enabled. In case you
are not reading this in a Web browser, here is the original traceback:
Traceback (most recent call last):
File "/var/www/html/Main/cgi-bin/resize.py", line 12, in <module>
im = Image.open("../JS/upload/" + filename)
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1996, in open
fp = builtins.open(fp, "rb")
TypeError: file() argument 1 must be encoded string without NULL bytes, not str
-->
Does this mean that the formData I am sending over is empty?