Mar*_*rci 1 python python-requests
我正在尝试将文件上传到服务器,但出现此错误:
ValueError: cannot encode objects that are that are not 2-tuples
Run Code Online (Sandbox Code Playgroud)
编码:
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())
Run Code Online (Sandbox Code Playgroud)
我试过了,auth=HTTPBasicAuth(user, pass)但这也不起作用。解决办法是什么?
files只接受字典或(key, value)元组序列。为您的文件字段命名:
r = requests.post(url, auth=(user, password), files={'file': buffer.getvalue()})
Run Code Online (Sandbox Code Playgroud)
什么名称完全取决于您发布到的 API。这将数据multipart/form-data编码为编码的 POST 正文。见POST一个多编码的文件部分中的requests快速入门文档。
如果您需要将文件数据作为 body 中的唯一数据发布,请使用data关键字参数:
r = requests.post(url, auth=(user, password), data=buffer.getvalue()})
Run Code Online (Sandbox Code Playgroud)
我不确定您为什么使用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})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6693 次 |
| 最近记录: |