Requests使得上傳多部分編碼文件變得很簡單:
>>> url = 'http://httpbin.org/post' >>> files = {'file': open('report.xls', 'rb')} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "<censored...binary...data>" }, ... }
你可以顯式地設置文件名,文件類型和請求頭:
>>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "<censored...binary...data>" }, ... }
如果你想,你也可以發送作為文件來接收的字符串:
>>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "some,data,to,send\\nanother,row,to,send\\n" }, ... }
流式上傳
Requests支持流式上傳,這允許你發送大的數據流或文件而無需先把它們讀入內存。要使用流式上傳,僅需為你的請求體提供一個類文件對象即可:
with open('massive-body') as f: requests.post('http://some.url/streamed', data=f)
另外:
Requests本身雖然提供了簡單的方法POST多部分編碼(Multipart-Encoded)的文件,但是Requests是先讀取文件到內存中,然后再構造請求發送出去。
如果需要發送一個非常大的文件作為 multipart/form-data 請求時,為了避免把大文件讀取到內存中,我們就希望將請求做成數據流。
默認requests是不支持的(或很困難), 這時需要用到第三方包requests-toolbelt。
兩個庫POST多部分編碼(Multipart-Encoded)的文件示例代碼分別如下:
1. Requests庫(先讀取文件至內存中)
import requests url = 'http://httpbin.org/post' files = {'file': open('report.xls', 'rb')} r = requests.post(url, files=files) print r.text
2. Requests+requests-toolbelt庫(直接發送數據流)
import requests from requests_toolbelt.multipart.encoder import MultipartEncoder m = MultipartEncoder( fields={'field0': 'value', 'field1': 'value', 'field2': ('upload.zip', open('upload.zip', 'rb'), 'application/zip')} ) r = requests.post('http://httpbin.org/post', data=m, headers={'Content-Type': m.content_type}) print r.text
轉自:http://lovesoo.org/requests-post-multiple-part-encoding-multipart-encoded-file-format.html