2015-08-06 6 views
1

Я хочу использовать Python 2.7 без каких-либо модулей, не входящих в стандартную библиотеку, для загрузки файла на веб-сервер (который будет принимать такие запросы). Я знаю, что это можно сделать, загрузив данные как часть данных формы из нескольких частей, но мне интересно, могу ли я просто POST с Content-Type: application/pdf (например) и Content-Length установить длину файла и, иметь контент почты просто будет содержанием файла (в данном случае PDF). Если да, то какой самый простой способ сделать это?Загрузите содержимое файла в Python

+0

* Мне интересно, могу ли я просто POST с Content-Type: application/pdf * До * веб-сервера * принимать это или нет. Если сервер принимает только «multipart/form-data» для загрузки файлов, вы не можете заставить сервер принимать что-то еще. –

+0

Сначала определите, принимает ли сервер прямые сообщения без многостраничной полезной нагрузки. Вы можете сделать это, используя Postman (расширение Chrome) или библиотеку '' запрос '' Python ', или даже с 'urllib2' из стандартной библиотеки. Тогда ограничьте себя только stdlib, если вы действительно должны. –

+0

Возможны прямые загрузки. Просто установите параметр '' urllib2.Request() 'data (https://docs.python.org/2/library/urllib2.html#urllib2.Request) в содержимое вашего файла (открытое как двоичное) и установите Заголовок Content-Type. Готово. –

ответ

2

Если сервер будет принимать прямые сообщения полезной нагрузки (в отличие от файла, являющегося частью запроса multipart/form-data POST), вы можете просто установить параметр Request() данных в качестве файла данных:

import urllib2 

with open(filename, 'rb') as uploadfile: 
    request = urllib2.Request(url, data=uploadfile.read(), 
           {'Content-Type': 'application/pdf'}) 

response = urllib2.urlopen(request) 

urllib2.Request объект не делает никаких предположений о содержании data, кроме этого заголовок Content-Type будет установлен в application/x-www-form-urlencoded, если установлен data, если только вы не предоставите свой собственный.

Заголовок Content-Length будет установлен для вас, когда вы это сделаете.