загрузить файл на php-сервер с помощью клиента Python и получить

Apache, Php, Python

Этот вопрос неоднократно задавался на этом веб-сайте, но, будучи очень новым для python и php, мне было сложно найти правильный способ сделать это.

В настоящее время
часть моей клиентской части выглядит как (архивирует файл и отправляет его)

  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()

Серверная сторона выглядит

  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 ?>

Когда я запускаю свой файл Python, я получаю этот вывод

Загрузить:
Тип:
Размер: 0 Кб
Хранится в:

Это происходит специально для больших файлов.

2-я часть вопроса, когда я отправляю небольшой файл, я вижу это

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

Но там ничего нет. Как упоминалось в комментариях ниже, я пытался обновить php.ini.default, но я не получил никаких изменений, обновленных с помощью phpinfo даже после перезапуска

0

Решение

это мой код для загрузки файла

import poster, urllib2, gzip, StringIO, sys

def getUrllib2(upload = False, redirect = False):
if upload:
handlers = poster.streaminghttp.get_handlers()
else:
handlers = []
err = HTTPError()
handlers.append(err)
handlers.append(XmlParseTest.getCookie())

try:
opener = urllib2.build_opener(*handlers)
except Exception, e:
print err.getErrorMsg()
raise e
return opener,err

def sendMultipartPost(url, params, files):
#params like this: {'id': '20010', 'type':'zip'}
#files like thie : {'uploadfile':'/tmp/testfile.zip'}
posterParams = []
for key in params:
value = params[key]
try:
posterParams.append(poster.encode.MultipartParam(key, value))
except Exception, e:
print e, key, value
raise e

for key in files:
value = files[key]
try:
value = value.encode(sys.getfilesystemencoding())
posterParams.append(poster.encode.MultipartParam.from_file(key, value))
except Exception, e:
print e, key, value
raise e

try:
datagen, headers = poster.encode.multipart_encode(posterParams)
except Exception, e:
print e, key, value
raise e

if headers is None:
headers = {}

try:
request = urllib2.Request(url, datagen, headers)
request.add_header('Accept-encoding', 'gzip')
request.add_header("Accept", "*/*")
#             print request
#             print request.get_data()
opener,err = getUrllib2(True, False)
response = opener.open(request)
except Exception, e:
print e, url, files
print err.getErrorMsg()
raise e
data = response.read()
'''if response is too large, use this
data = response.read(16*1024)
length = len(data)
_data = None
while length:
if _data: data += _data
_data = response.read(16*1024)
length = len(_data)
'''
if 'gzip' == response.headers.get('content-encoding', ''):
compressedstream = StringIO.StringIO(data)
gzipper = gzip.GzipFile(fileobj=compressedstream)
data =gzipper.read()

return data
0

Другие решения

Php и Apache ссылались на /etc/php.ini.default, и php.ini не было. В итоге я создал php.ini с точно такой же конфигурацией. После перезагрузки я вижу изменения.

0

По вопросам рекламы [email protected]