phppythonapacheweb-servicesposter

upload file to a php server using python client and receive


Apache, Php, Python

This question has been asked on multiple occasions on this website but being very new to both python and php, it was hard for me to figure out a right way to do it.

Currently portion of my client side looks like (zips a file and send it)

  1 #!/usr/bin/python
  2 
  3 import os
  4 import zipfile
  5 import sys
  6 import hashlib
  7 from poster.encode import multipart_encode
  8 from poster.streaminghttp import register_openers
  9 import urllib2
 10 
 11 def zip(src, dst):
 12     zf = zipfile.ZipFile("%s.zip" % (dst), "w", zipfile.ZIP_DEFLATED)
 13     abs_src = os.path.abspath(src)
 14     for dirname, subdirs, files in os.walk(src):
 15         for filename in files:
 16             absname = os.path.abspath(os.path.join(dirname, filename))
 17             arcname = absname[len(abs_src) + 1:]
 18             print 'zipping %s as %s' % (os.path.join(dirname, filename), arcname)
 19             zf.write(absname, arcname)
 20     zf.close()
 21 
 22 # zip the file using source to the destination.. can do some error checks here
 23 zip(sys.argv[1], sys.argv[2])
 24 
 25 # create md5
 26 md5 = hashlib.md5(open(sys.argv[2]+".zip", 'rb').read()).hexdigest()
 27 
 28 # Register the streaming http handlers with urllib2
 29 register_openers()
 30 
 31 filename=sys.argv[2]+".zip"
 32 
 33 # headers contains the necessary Content-Type and Content-Length
 34 # datagen is a generator object that yields the encoded parameters
 35 datagen, headers = multipart_encode({
 36     'type'      :       'zip',
 37     'name'      :       "hello.zip",
 38     'file'      :       open(filename)
 39 })
 40 
 41 # make a call
 42 request = urllib2.Request("http://localhost/upload.php", datagen, headers)
 43 
 44 
 45 # Actually do the request, and get the response
 46 print urllib2.urlopen(request).read()

Server side looks like

  1 <?php
  2 if ($_FILES["file"]["error"] > 0) {
  3         echo "Error: " . $_FILES["file"]["error"] . "<br />";
  4     } else {
  5         echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  6         echo "Type: " . $_FILES["file"]["type"] . "<br />";
  7         echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  8         echo "Stored in: " . $_FILES["file"]["tmp_name"];
  9     }
 15 
 16 
 17 ?>

When i run my python file, i get this output

Upload:
Type:
Size: 0 Kb
Stored in:

This happens specially for bigger files.

2nd part of the question, when i am sending the small file i see this

Upload: upload.php<br />Type: application/x-httpd-php<br />Size: 0.4775390625 Kb<br />Stored in: /private/var/tmp/phpHapPaO
Beautiful-iMac:~ agauravdeep$ open  /private/var/tmp/
Beautiful-iMac:~ agauravdeep$ cd /private/var/tmp/phpHapPaO
-bash: cd: /private/var/tmp/phpHapPaO: No such file or directory
Beautiful-iMac:~ agauravdeep$ vi /private/var/tmp/phpHapPaO
You have new mail in /var/mail/agauravdeep

But There is nothing there. As mentioned in comments below, i have tried to update php.ini.default but i didn't get any change updated with phpinfo even with restart


Solution

  • Php and Apache were referring to /etc/php.ini.default and there was no php.ini. I ended up creating php.ini with exact same configuration. After restart, i see the changes.