如何使用 python 请求上传文件?

新手上路,请多包涵

我正在执行使用 Python 请求库上传文件的简单任务。我搜索了Stack Overflow,似乎没有人遇到同样的问题,即服务器没有收到文件:

 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)

我用我的文件名填充’upload_file’关键字的值,因为如果我把它留空,它会说

Error - You must select a file to upload!

现在我得到了

File  file.txt  of size    bytes is  uploaded successfully!
Query service results:  There were 0 lines.

仅当文件为空时才会出现。所以我不知道如何成功发送我的文件。我知道该文件有效,因为如果我去这个网站并手动填写表格,它会返回一个很好的匹配对象列表,这就是我所追求的。我真的很感激所有的提示。

其他一些相关的线程(但没有回答我的问题):

原文由 scichris 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 794
2 个回答

如果 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')  # create an empty demo file
<_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 .然后,您可能还想设置一个 Content-Type 标头,否则不会设置任何标头。请参阅 Python 请求 - POST 文件中的数据

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

r = requests.post(url, files=files)
r.text

原文由 laycat 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题