Так что я борюсь с этим уже второй день подряд и до сих пор ничего. Нашел несколько решений в интернете, но я все еще получаю «Внутреннюю ошибку сервера» при попытке отправить файлы с помощью POST. Идея заключается в следующем: я отправляю файл, открытый в оболочке python, в функцию django на моем сервере, которая будет читать и сохранять файл там. Я пробовал методы urllib, urllib2 (с модулем poster и без него), методы httplib и Multipart . Вот полный список того, что я пробовал вместе с результатами:
#Variables
In [35]: url = "http://www.address"
In [36]: values = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
In [37]: dataurllib = urllib.urlencode(values)
In [39]: dataposterlib, dataheaders = multipart_encode(values)
In [40]: dataposterlib
Out[40]: <generator object yielder at 0x15a0410>
In [41]: headers
{'Content-Length': 491,
'Content-Type': 'multipart/form-data; boundary=13936c2ddba0441eab9c3f4133a4009e'}
In [43]: f = open("winter.jpg", "rb")
In [45]: filegen, fileheaders = multipart_encode({"file": f})
In [46]: filegen
Out[46]: <generator object yielder at 0xc5b3c0>
In [47]: fileheaders
Out[47]:
{'Content-Length': 39876,
'Content-Type': 'multipart/form-data; boundary=0aa7a1b68d714440be06e166080925ec'}
#Working:
1. urllib.urlopen("http://www.address", data=urllib.urlencode({"key": "value"}))
2. urllib.urlopen(url, data=urllib.urlencode({"key": "value"}))
3. urllib.urlopen(url, data=urlib.urlencode(values))
4. urllib.urlopen(url, urlib.urlencode(values))
5. urllib.urlopen(url, data=dataurllib)
6. urllib.urlopen(url, dataurllib)
7. urllib.urlopen(url, data=urllib.urlencode({"file": f})) : works, but doesnt send file
8. import cookielib
from utils.multipart import MultipartPostHandler
cookies = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies), MultipartPostHandler)
params = { "username": "bob", "password": "riviera", "file": f }
opener.open(url, params)
#Not working:
4. u = urllib.urlopen(url, "string")
5. u = urllib.urlopen(url, data="string")
7. u = urllib2.urlopen(url, data=urllib.urlencode(values)) : Error 500 but sends data
6. u = urllib2.urlopen("http://www.fandrive.yum.pl/event/upload/", data=urllib.urlencode({"key": "value"})) : Error 500 but sends data
7. u = urllib2.urlopen(url, data=urllib.urlencode({"key": "value"})) : Error 500 but sends data
8. u = urllib2.urlopen(url, data=dataurllib) : Error 500 but sends data
9. u = urllib2.urlopen(url, dataurllib) : Error 500 but sends data
10. In [31]: req = urllib2.Request(url, f, fileheaders)
urllib2.urlopen(req) : Error 500
11. req = urllib2.Request(url, filegen, fileheaders)
urllib2.urlopen(req) : Error 500, very seldomly sends data
12. req = urllib2.Request(url, dataurllib)
urllib2.urlopen(req) : Error 500, sends data
Я нашел кого-то с такой же проблемой, поэтому я позаимствовал его функцию django (которая основана на этом посте :
def upload(request):
logging.debug("GO")
for key, file in request.FILES.items():
path = '/path/'+ file.name
logging.debug(path)
dest = open(path.encode('utf-8'), 'wb+')
logging.debug(dest)
if file.multiple_chunks:
loggin.debug("big")
for c in file.chunks():
dest.write(c)
else:
logging.dobug("small")
dest.write(file.read())
dest.close()
destination = path + 'test.txt'
logging.debug(destination)
file = open(destination, "a")
file.write("file \n")
file.close
return 0
Я заметил, что даже когда моя функция запускается, отправленные файлы не сохраняются, а также код после пропуска destination...
. Так же, как и тайм-аут, прежде чем он достигнет этого места. Wireshark показывает отправку запроса POST, но сервер всегда выдает ошибку 500. Как это происходит? Я пробовал несколько комбинаций с моими 2 серверами, а также отправку с локального компьютера, но все еще ничего. Что мне здесь не хватает? Я использую тот же код, что и все остальные в Интернете. Даже встроенный модуль urllib2 всегда выдает ошибку, даже если urllib работает.
EDIT
Я изменил сервер на другой и, наконец, у меня есть некоторый солидный журнал ошибок (сторона получателя):
[Sat Oct 16 20:40:46 2010] [error] [client IP] mod_python (pid=24773, interpreter='host', phase='PythonHandler', handler='django.core.handlers.modpython'): Application error
[Sat Oct 16 20:40:46 2010] [error] [client IP] ServerName: 'xxx'
[Sat Oct 16 20:40:46 2010] [error] [client IP] DocumentRoot: 'path'
[Sat Oct 16 20:40:46 2010] [error] [client IP] URI: '/error/internalServerError.html'
[Sat Oct 16 20:40:46 2010] [error] [client IP] Location: None
[Sat Oct 16 20:40:46 2010] [error] [client IP] Directory: None
[Sat Oct 16 20:40:46 2010] [error] [client IP] Filename: 'path/error/internalServerError.html'
[Sat Oct 16 20:40:46 2010] [error] [client IP] PathInfo: ''
[Sat Oct 16 20:40:46 2010] [error] [client IP] Traceback (most recent call last):
[Sat Oct 16 20:40:46 2010] [error] [client IP] File "/usr/lib/python2.5/site-packages/mod_python/importer.py", line 1537, in HandlerDispatch\n default=default_handler, arg=req, silent=hlist.silent)
[Sat Oct 16 20:40:46 2010] [error] [client IP] File "/usr/lib/python2.5/site-packages/mod_python/importer.py", line 1229, in _process_target\n result = _execute_target(config, req, object, arg)
[Sat Oct 16 20:40:46 2010] [error] [client IP] File "/usr/lib/python2.5/site-packages/mod_python/importer.py", line 1128, in _execute_target\n result = object(arg)
[Sat Oct 16 20:40:46 2010] [error] [client IP] File "/usr/lib/python2.5/site-packages/django/core/handlers/modpython.py", line 228, in handler\n return ModPythonHandler()(req)
[Sat Oct 16 20:40:46 2010] [error] [client IP] File "/usr/lib/python2.5/site-packages/django/core/handlers/modpython.py", line 220, in __call__\n req.write(chunk)
[Sat Oct 16 20:40:46 2010] [error] [client IP] IOError: Write failed, client closed connection.
[Sat Oct 16 20:40:46 2010] [error] [client IP] python_handler: Dispatch() returned non-integer.