Heim > Fragen und Antworten > Hauptteil
P粉4222270232023-08-17 12:40:36
(2018) 新的Python requests库简化了这个过程,我们可以使用 'files' 变量来表示我们要上传一个多部分编码的文件
url = 'http://httpbin.org/post' files = {'file': open('report.xls', 'rb')} r = requests.post(url, files=files) r.text
P粉5904283572023-08-17 11:32:38
如果upload_file
是指文件,请使用:
files = {'upload_file': open('file.txt','rb')} values = {'DB': 'photcat', 'OUT': 'csv', 'SHORT': 'short'} r = requests.post(url, files=files, data=values)
然后requests
将发送一个多部分表单POST请求体,其中upload_file
字段设置为file.txt
文件的内容。
文件名将包含在特定字段的mime头中:
>>> import requests >>> open('file.txt', 'wb') # 创建一个空的演示文件 <_io.BufferedWriter name='file.txt'> >>> files = {'upload_file': open('file.txt', 'rb')} >>> print(requests.Request('POST', 'http://example.com', files=files).prepare().body.decode('ascii')) --c226ce13d09842658ffbd31e0563c6bd Content-Disposition: form-data; name="upload_file"; filename="file.txt" --c226ce13d09842658ffbd31e0563c6bd--
请注意filename="file.txt"
参数。
如果需要更多控制,可以使用元组作为files
映射值,元组的长度应在2到4之间。第一个元素是文件名,其后是内容,还可以选择性地包含内容类型头和其他头的映射:
files = {'upload_file': ('foobar.txt', open('file.txt','rb'), 'text/x-spam')}
这将设置一个替代文件名和内容类型,省略了可选的头。
如果您希望整个POST请求体来自文件(没有指定其他字段),则不要使用files
参数,直接将文件作为data
进行POST。您可能还希望设置一个Content-Type
头,否则将不会设置任何头。参见Python requests - POST data from a file。