ValueError:无法编码不是 2 元组的对象

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)但这也不起作用。解决办法是什么?

Mar*_*ers 5

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)