2015-10-13 2 views
2

Я извиняюсь прямо здесь ... Я HTTP noob ... но мне нужно создать скрипт python, который берет файл и загружает его на сервер в кусках, включая дополнительные данные.Python: Загрузите файл в chunk на сервер, включая дополнительные поля

EDIT: Это только один файл, который я хочу, чтобы загрузить ... но на куски

Так что я начал исследовать и наткнулся на 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... 

Я понял, что я могу создать Chunked загрузку с помощью генератора. И я также подумал, что могу создать не-файловые границы, используя опцию file=.

Но проблема в том, что я не могу использовать оба :(А также при использовании моего genrator я не могу определить Ф.Э. Content-Type моих кусков, ни имя ...

Опять ... извините за мой плохой словарный запас :)

Любая помощь очень ценится

ответ

1
import requests 
import json 

#from here http://stackoverflow.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 
+1

Я не очень понимаю, как это поможет мне? Потому что содержание в вашем примере 'doc.txt' и' doc2.html' не загружается в куски ... Я бы хотел определить, сколько байтов должно быть у каждого байта этих файлов ... – Georg

Смежные вопросы