requests.put上传文件Content-Disposition被写进了文件里
用requests.put上传文件
files = {'file':open(filepath,'rb').read()} rs = requests.put(url=url, headers=headers,files=files)
上传成功后,打开上传成功的文件,发现请求头被写进了文件
--7deceadf843ce58e38485caec636a5bc Content-Disposition: form-data; name="file"; filename="hmy.txt" huangmanyao --7deceadf843ce58e38485caec636a5bc--
解决方案
rs = requests.put(url=url,headers=headers,data=open(filepath,'rb'))
使用requests.put()
和files
参数发送一个多部分/表单数据编码的请求,即使声明了正确的内容类型,服务器似乎也无法在不损坏数据的情况下处理该请求。
curl
命令只是使用请求主体中包含的原始数据执行PUT。您可以通过在data
参数中传递文件数据来创建类似的请求。指定标题中的内容类型:
headers = headers = {'Content-type': 'image/jpeg', 'Slug': fileName}
r = requests.put(url, data=open(path, 'rb'), headers=headers, auth=('username', 'pass'))
您可以根据需要改变Content-type
头以适应负载。
尝试为文件设置Content-type
。
如果您确定它是一个文本文件,那么请尝试text/plain
您在curl
命令中使用的text/plain
,即使您似乎正在上载一个jpeg文件?但是,对于jpeg图像,应该使用image/jpeg
。
否则,对于任意二进制数据,可以使用application/octet-stream
:
openBin = {'file': (fileName, open(path,'rb'), 'image/jpeg' )}
另外,不需要显式地读取代码中的文件内容,requests
将为您执行此操作,因此只需传递上面所示的打开文件句柄。
参考资料:https://www.cnpython.com/qa/92618