2014-10-10 3 views
-1

Я пытаюсь использовать Requests, чтобы загрузить файл в форму, но я получаю обратно сообщение об ошибке с сервера Tomcat говоря:Установить имя заголовок многочастного закодированного POST файла

отправлен запрос на клиент был синтаксически неправильным.

После прочтения this answer мне удалось напечатать запрос, что я делаю, и при сравнении его с просьбой, в браузере я заметил, что полезная нагрузка запроса name не выровнена, так что я предполагаю, это моя проблема.

В Просьбы docs для постинга многокомпонентные закодированные файлы показывает, что вы можете изменить имя файла, CONTENT_TYPE и заголовки в явном виде:

>>> url = 'http://httpbin.org/post' 
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})} 

Это, кажется, работает хорошо, но, как упоминалось выше, я также нужно установить name а также filename и content-type.

копаться на GitHub репо я нашел метод _encode_files в models.py, который, кажется, чтобы для указания name:

rf = RequestField(name=k, data=fp.read(), 
        filename=fn, headers=fh) 

Но я не могу показаться, чтобы получить эту работу и в моем приложении, как и с приведенным выше примером, у меня есть имя файла, указанное перед ссылкой на файл:

files = {'file': (filename, open(filePath, 'rb'), 'application/x-zip-compressed')} 

Что мне здесь не хватает?

ответ

1

Название устанавливается с помощью ключа в вашем словаре files. Просто изменить эту клавишу, чтобы установить имя поле до требуемого значения:

>>> import requests 
>>> files = {'foobar': ('foo.txt', 'foo\ncontents\n','text/plain')} 
>>> req = requests.Request('POST', 'http://httpbin.org/post', files=files).prepare() 
>>> print req.body 
--49773910d9514216894b697cb70e9f21 
Content-Disposition: form-data; name="foobar"; filename="foo.txt" 
Content-Type: text/plain 

foo 
contents 

--49773910d9514216894b697cb70e9f21-- 

Обратите внимание на name="foobar" элементе Content-Disposition заголовка каждой части.

+0

Не могу поверить, что я этого не заметил. благодаря – ydaetskcoR