Python 的 requests 库上传文件报错如何解决

return self.request(‘POST’, url, data=data, json=json, **kwargs)
File “/Users/libin/pyspider_env/lib/python2.7/site-packages/requests/sessions.py”, line 488, in request
resp = self.send(prep, **send_kwargs)
File “/Users/libin/pyspider_env/lib/python2.7/site-packages/requests/sessions.py”, line 609, in send
r = adapter.send(request, **kwargs)
File “/Users/libin/pyspider_env/lib/python2.7/site-packages/requests/adapters.py”, line 473, in send
raise Connecti onError(err, request=request)
requests.exceptions.Connecti onError: (‘Connection aborted.’, error(32, ‘Broken pipe’))

谷歌了一下,也没发现什么解决的方法
Python 的 requests 库上传文件报错如何解决


2 回复

遇到 requests 上传文件报错,先别慌,多半是请求格式没整对。最常见的坑就是 files 参数没传对。我直接给你个能跑的代码,你对照着看看。

import requests

# 假设你的文件叫 'myfile.txt', 服务器接收的字段名是 'userfile'
file_path = 'myfile.txt'
url = 'http://httpbin.org/post'  # 这是个测试用的URL,你可以换成自己的

# 核心:正确构造 files 字典
try:
    with open(file_path, 'rb') as f:  # 一定要用二进制模式 'rb' 打开
        files = {'userfile': (file_path, f, 'text/plain')}  # 格式:(文件名, 文件对象, 可选MIME类型)
        # 或者更简单的写法,让库自动判断类型:
        # files = {'userfile': open(file_path, 'rb')}
        # 但上面这种写法需要你手动关闭文件,不推荐。

        response = requests.post(url, files=files)
        print(f"状态码: {response.status_code}")
        print(f"响应内容: {response.json()}")  # 如果是JSON返回

except FileNotFoundError:
    print(f"错误:文件 '{file_path}' 没找到,检查路径。")
except requests.exceptions.RequestException as e:
    print(f"网络请求出错: {e}")
except Exception as e:
    print(f"其他错误: {e}")

几个关键点:

  1. files 参数必须是字典,键是服务器要求的字段名(比如 userfilefile),值是一个元组。元组结构是 (文件名, 文件对象, MIME类型),后两个参数可选。直接传文件对象也行,但最好用元组形式更规范。
  2. 文件必须用二进制模式 'rb' 打开,特别是图片、视频等非文本文件,用文本模式会损坏数据。
  3. 如果服务器还需要其他表单字段,用 data 参数一起传,比如 requests.post(url, data={'key': 'value'}, files=files)
  4. 错误处理很重要,用 try...except 包起来,能帮你快速定位是文件找不到、网络问题还是服务器返回错误。

常见错误自查:

  • FileNotFoundError:文件路径错了。
  • TypeErrorfiles 参数格式不对,很可能没构成字典或元组。
  • 服务器返回 4xx/5xx 错误:检查URL、字段名、认证信息(如 headersauth)是否正确。

一句话总结:检查 files 参数格式、文件路径和打开模式,用 try-except 抓错误。


从这个信息来看是意外断开连接了。如果是墙内的话考虑挂代理。

回到顶部