重复发送已打开文件的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
相关产品推荐
相关产品推荐

