Python: загрузка файла в чанке на сервер, включая дополнительные поля
Я извиняюсь прямо здесь... Я HTTP Noob... но мне нужно создать скрипт Python, который принимает файл и загружает его на сервер порциями, включая дополнительные данные.
РЕДАКТИРОВАТЬ: это только один файл, который я хочу загрузить... но по частям
Итак, я начал исследования и наткнулся pycurl
что кажется довольно сложным. Итак, я пошел на requests
который выглядит действительно красиво и интуитивно понятно.
И в основном я получил это работая по частям... но... не все это вместе взятые:)
Я видел, что могу использовать генераторы для предоставления порций своих данных. Это потрясающе! Но мне также нужно отправить (извините... мой словарный запас, когда дело доходит до такого рода вещей очень ограничено) многочастных границ??? Другие поля, которые содержат информацию JSON...
Поэтому мои запросы должны выглядеть примерно так:
POST / HTTP/1.1
Host: some server
Content-Type: multipart/form-data;
Connection: Keep Alive
Transfer-Encoding: chunked
--boundary
Content-Disposition: form-data; name="Name of my field"
Content-Type: application/JSON; charset=utf-8
Content-Transfer-Encoding: 8bit
{"Some" : "content", "in" : "here"}
--boundary
Content-Disposition: form-data; name="My File"
Content-Type: audio/mpeg
Content-Transfer-Encoding: binary
... chunk 1 ....
--boundary
Content-Disposition: form-data; name="My File"
Content-Type: audio/mpeg
Content-Transfer-Encoding: binary
... chunk 2 ....
and so on...
Я понял, что могу создать загрузку по частям, используя генератор. И я также подумал, что я могу создать не-файловые границы с помощью file=
вариант.
Но проблема в том, что я не могу использовать оба:(А также, когда использую мой генератор, я не могу определить, Content-Type
из моих кусков, ни имени...
Опять... извините за мой плохой словарный запас:)
Любая помощь очень ценится
1 ответ
import requests
import json
#from here http://stackru.com/a/23816211/642096
def pretty_print_POST(req):
"""
At this point it is completely built and ready
to be fired; it is "prepared".
However pay attention at the formatting used in
this function because it is programmed to be pretty
printed and may differ from the actual request.
"""
print('{}\n{}\n{}\n\n{}'.format(
'-----------START-----------',
req.method + ' ' + req.url,
'\n'.join('{}: {}'.format(k, v) for k, v in req.headers.items()),
req.body,
))
url = 'http://httpbin.org/post'
data = {'input_name': json.dumps({
'json': 'here'
})}
files = {
'file1': ('doc.txt', open('/tmp/doc.txt', 'rb'), 'text/plain'),
'file2': ('doc2.html', open('/tmp/doc2.html', 'rb'), 'text/html'),
}
r = requests.post(url, data=data, files=files)
pretty_print_POST(r.request)
print r.text