如何使用Python的requests库上传文件?
P粉071559609
P粉071559609 2023-08-16 18:44:37
0
2
660
<p>我正在使用Python的requests库执行一个简单的任务,即上传文件。我在Stack Overflow上搜索了一下,似乎没有人遇到同样的问题,即服务器没有接收到文件:</p> <pre class="brush:php;toolbar:false;">import requests url='http://nesssi.cacr.caltech.edu/cgi-bin/getmulticonedb_release2.cgi/post' files={'files': open('file.txt','rb')} values={'upload_file' : 'file.txt' , 'DB':'photcat' , 'OUT':'csv' , 'SHORT':'short'} r=requests.post(url,files=files,data=values)</pre> <p>我将'upload_file'关键字的值填入了我的文件名,因为如果我留空,它会显示:</p> <pre class="brush:php;toolbar:false;">错误 - 您必须选择一个要上传的文件!</pre> <p>现在我得到了:</p> <pre class="brush:php;toolbar:false;">文件 file.txt 的大小为 bytes,上传成功! 查询服务结果:共有 0 行。</pre> <p>这只有在文件为空时才会出现。所以我不知道如何成功发送我的文件。我知道文件是有效的,因为如果我手动填写表单并访问这个网站,它会返回一个很好的匹配对象列表,这正是我想要的。我真的很感谢所有的提示。</p> <p>一些相关的其他线程(但没有解决我的问题):</p> <ul> <li>使用Python脚本通过POST发送文件</li> <li>http://docs.python-requests.org/en/latest/user/quickstart/#response-content</li> <li>使用requests上传文件并发送额外数据</li> <li>http://docs.python-requests.org/en/latest/user/advanced/#body-content-workflow</li> </ul><p><br /></p>
P粉071559609
P粉071559609

全部回复(2)
P粉422227023

(2018) 新的Python requests库简化了这个过程,我们可以使用 'files' 变量来表示我们要上传一个多部分编码的文件

url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}

r = requests.post(url, files=files)
r.text
P粉590428357

如果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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板