You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重复发送已打开文件的POST请求失败原因分析

为什么首次文件上传请求成功,后续请求失败?

这问题的核心在于文件对象的指针位置,咱们一步步拆解:

代码示例1的问题所在

你把with open(...) as file放在了循环外面,意味着整个循环复用的是同一个文件对象。当第一次调用requests.post时,requests会读取文件的全部内容,此时文件内部的读取指针会移动到文件末尾(EOF)。

当你第二次、第三次再用这个文件对象发送请求时,指针已经在末尾了,没有任何内容可以被读取。服务器收到空的文件数据,自然返回500错误。

你提到打印file和type(file)没变化,这很正常——文件对象本身和它的类型确实没变,但它内部的指针状态是看不到的,这个状态才是导致后续请求失败的关键。

代码示例2为什么能成功

而示例2把with open(...)放进了循环里,意味着每次循环都会重新打开文件。每次打开的新文件对象,读取指针默认都在文件开头位置,所以每次请求都能完整读取文件内容,服务器自然能正常处理,返回200。

修复示例1的小技巧

如果想保留示例1的结构(只打开一次文件),可以在每次请求前手动把文件指针重置到开头,用file.seek(0)就行:

import requests
url = # any API that accepts file in request
with open("/mnt/d/a.png", "rb") as file:
    for i in range(3):
        file.seek(0)  # 将指针重置到文件起始位置
        ts = requests.post(url, files={"file": file})
        print(ts)

这样修改后,三次请求都会返回200。

内容的提问来源于stack exchange,提问作者Sumant Agnihotri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 03:17:41