使用Python requests库上传图片失败求助:返回200但图片不显示
以下是针对性的排查和解决步骤:
补全有效Cookies
你的cookies字典是空的,这大概率是核心问题。上传图片需要验证用户登录状态,服务器依赖Cookies识别会话。打开浏览器登录目标网站,通过开发者工具(F12 → 网络面板)找到上传请求,复制其中的Cookies(比如session_id、auth_token这类字段)填入代码的cookies字典中。完善files参数的格式
服务器可能需要明确文件名和MIME类型才能正确处理文件。修改files定义,补充文件名和图片类型:files = { 'file': ( "heart-confetti-celebration-background_805687-804.jpg", open("heart-confetti-celebration-background_805687-804.jpg", 'rb'), 'image/jpeg' ) }检查响应内容的实际含义
虽然返回200状态码,但服务器可能返回了失败信息或未完成处理。打印response.text后,仔细查看是否包含错误提示、图片未保存的原因,或者是否返回了正确的图片存储路径——如果路径无效,网页自然无法显示。移除不必要的请求头,避免冲突
requests会自动为multipart/form-data请求生成正确的Content-Type头,手动设置的部分headers可能与自动生成的冲突。建议移除Sec-Ch-Ua、Sec-Fetch-*这类浏览器自动添加的头,只保留必要的User-Agent、Origin、Referer、X-Requested-With和Accept相关头。检查是否需要CSRF令牌
部分网站会要求上传时携带CSRF令牌,这个令牌通常在上传页面的HTML中(比如隐藏的<input>标签,name为csrf_token或类似)。抓取页面源码提取令牌后,将其作为表单字段添加到请求中:data = {'csrf_token': '提取到的令牌值'} response = requests.post(url, headers=headers, files=files, cookies=cookies, data=data)对比浏览器抓包的请求细节
用浏览器完成一次正常的图片上传,通过开发者工具抓取完整请求,对比你的代码中的请求头、表单字段、Cookies等所有参数,找出差异并修正——这是最有效的排查方法。
内容的提问来源于stack exchange,提问作者dilshan max

