使用Python Requests上传文件后内容异常的问题排查
问题原因及解决方案
嘿,这个问题我太熟悉了!核心问题在于你用了两种完全不同的HTTP请求格式上传文件,服务器对它们的处理逻辑自然不一样:
1. curl -T 是怎么上传的?
curl -u log:pass -T filepath http://something/sth.py 这个命令发送的是PUT请求,它会把文件的原始内容直接作为HTTP请求的请求体发送,没有任何额外的包装信息。服务器收到的就是纯纯的文件内容,所以下载后和原文件完全一致。
2. Requests的files参数做了什么?
当你用requests.post(..., files=files)时,Requests库会自动把请求编码成multipart/form-data格式——这是HTML表单上传文件时用的标准格式。你下载后看到的那些--3541f6ca4fc1fc7a26a3bef9ee42edcc(表单边界字符串)、Content-Disposition头,都是这个格式自动加上的包装内容。如果服务器是按照“直接接收文件内容”的逻辑处理(比如对应curl的PUT上传),它就会把整个multipart表单的内容当成文件保存,自然就多出了那些额外的东西。
正确的Requests上传方式
要和curl的行为一致,你需要用PUT请求,把文件内容直接作为请求体发送,而不是用files参数:
with open(filepath, 'rb') as f: auth = ('log', 'pass') r = requests.put('http://something/sth.py', data=f, auth=auth)
这个代码里,我们用data参数传入打开的文件对象,Requests会把文件的原始内容作为请求体发送,和curl的-T行为完全一致,服务器就能正确保存文件内容了。
内容的提问来源于stack exchange,提问作者Tomasz Hołda
相关产品推荐
相关产品推荐

