我正在尝试将文件上传到服务器,但我收到此错误:
ValueError: cannot encode objects that are that are not 2-tuples
代码:
import requests
from StringIO import StringIO
buffer = StringIO()
url = 'http://example.com/files/'
user, password = 'ex', 'ample'
buffer.write(open(r'C:\Users\example\Desktop\code\de.txt','rb').read())
r = requests.post(url, auth=(user, password), files=buffer.getvalue())
我尝试了auth=HTTPBasicAuth(user, pass)
,但这也无效。什么可以解决方案?
答案 0 :(得分:1)
files
只接受(key, value)
元组的字典或序列。为您的文件字段命名:
r = requests.post(url, auth=(user, password), files={'file': buffer.getvalue()})
究竟什么名称取决于您要发布的API。这会将数据编码为multipart/form-data
编码的POST正文。请参阅requests
快速入门文档的POST a Multipart-Encoded file section。
如果您需要将文件数据作为正文中的唯一数据发布,请使用data
关键字参数:
r = requests.post(url, auth=(user, password), data=buffer.getvalue()})
我不确定你为什么使用StringIO
缓冲区; requests
可以直接处理文件句柄 ,而无需事先将所有内容都读入内存。即使你这样做,你也可以直接传递open(....).read()
结果,而无需先通过内存缓冲区;这就是矫枉过正。
我只是打开文件,然后requests
读取并为我们传输该文件:
with open(r'C:\Users\example\Desktop\code\de.txt','rb') as filedata:
r = requests.post(url, auth=(user, password), files={'file': filedata})