【发布时间】:2021-12-29 14:07:01
【问题描述】:
我有一个 FastAPI 端点,它接收一个文件,将它上传到 s3,然后处理它。一切正常,除了处理失败并显示此消息:
File "/usr/local/lib/python3.9/site-packages/starlette/datastructures.py", line 441, in read
return self.file.read(size)
File "/usr/local/lib/python3.9/tempfile.py", line 735, in read
return self._file.read(*args)
ValueError: I/O operation on closed file.
我的简化代码如下所示:
async def process(file: UploadFile):
reader = csv.reader(iterdecode(file.file.read(), "utf-8"), dialect="excel") # This fails!
datarows = []
for row in reader:
datarows.append(row)
return datarows
如何读取上传文件的内容?
更新
我设法进一步隔离了问题。这是我的简化端点:
import boto3
from loguru import logger
from botocore.exceptions import ClientError
UPLOAD = True
@router.post("/")
async def upload(file: UploadFile = File(...)):
if UPLOAD:
# Upload the file
s3_client = boto3.client("s3", endpoint_url="http://localstack:4566")
try:
s3_client.upload_fileobj(file.file, "local", "myfile.txt")
except ClientError as e:
logger.error(e)
contents = await file.read()
return JSONResponse({"message": "Success!"})
如果 UPLOAD 为 True,我会收到错误消息。如果不是,一切正常。上传后似乎 boto3 正在关闭文件。有什么办法可以重新打开文件吗?或者发一份给upload_fileobj?
【问题讨论】:
-
读取上传文件需要等待内容fastapi.tiangolo.com/tutorial/request-files/…
标签: python file upload fastapi