在日常开发中,我们经常会遇到需要上传文件到服务器的场景。如果你选择使用 aiohttp
进行异步请求,上传文件的方式需要特别注意,否则可能会遇到一些令人头疼的问题——比如文件被提前关闭,导致上传失败。这篇文章将为你详细解析这个问题,并提供有效的解决方案,帮助你在开发过程中少踩坑。
问题背景
在某次项目开发中,我需要通过 aiohttp
异步请求将文件上传至服务器。按照惯例,我写了如下代码:
with open(full_path, 'rb') as f:
data = {'file': f}
response_text = await self._request("POST", url, headers=headers, data=data)
result = orjson.loads(response_text)
这段代码看似合理,但在实际运行时却抛出了 ValueError: I/O operation on closed file
的错误。错误栈信息显示,这个异常来自 aiohttp
的 payload.py
文件,提示说进行了 I/O 操作时文件已关闭。
问题分析
造成这个错误的主要原因在于 with open
语句与异步请求的结合使用。with ope