我正在使用 fastapi 将图像上传到我的 s3 存储桶。首先,我尝试使用预先签名的 url 方法从邮递员上传图像,它工作正常。但是当我尝试使用 upload_fileobj 直接从服务器上传图像(大小〜7kb)时,它花费了大量时间并出现连接超时错误。花了这么多时间后,我不明白为什么请帮助我。
我的代码:-
from fastapi import FastAPI, UploadFile, File
import boto3
app = FastAPI()
s3 = boto3.client('s3',
aws_access_key_id='******',
aws_secret_access_key='********',
region_name="********")
BUCKET_NAME='*******'
@app.post("/upload")
async def upload(file: UploadFile = File(...)):
if file:
print(file.filename)
s3.upload_fileobj(file.file, BUCKET_NAME, file.filename)
return "file uploaded"
else:
return "error in uploading."
连接超时错误和图像上传时间过长表明你的代码可能在尝试上传文件之前将整个文件读入内存中。
upload_fileobj
方法旨在以块的形式流式传输数据,以避免这种情况,但你的代码中的某些内容可能会干扰此行为。
以下是最有可能的原因和解决方案:
- FastAPI 将整个文件读入内存: FastAPI 默认情况下可能会将整个上传的文件读入内存,然后再将其传递给你的函数。
解决方案:
使用
file: UploadFile = File(..., stream=True)
来指示 FastAPI 以流的形式处理文件。
- Boto3 配置: Boto3 默认情况下使用多部分上传,以便更有效地传输大型文件。然而,对于较小的文件,这可能会增加开销。
解决方案:
对于你的 7KB 文件,尝试禁用多部分上传。你可以通过在
upload_fileobj
中将
ExtraArgs={'ACL': 'public-read', 'ContentType': file.content_type, 'ServerSideEncryption': 'AES256'}
设置为你的所需值来实现。
- 网络问题: 缓慢或不稳定的网络连接也可能导致超时。
解决方案: 检查你的互联网连接并确保它稳定。你还可以尝试增加 Boto3 的超时时间。
以下是你更新后的代码:
from fastapi import FastAPI, UploadFile, File
import boto3
app = FastAPI()
s3 = boto3.client('s3',
aws_access_key_id='******',
aws_secret_access_key='********',
region_name="********")
BUCKET_NAME='*******'
@app.post("/upload")
async def upload(file: UploadFile = File(..., stream=True)):
if file:
print(file.filename)
s3.upload_fileobj(
file.file,
BUCKET_NAME,
file.filename,
ExtraArgs={'ACL': 'public-read', 'ContentType': file.content_type, 'ServerSideEncryption': 'AES256'}
)
return "文件已上传"
else:
return "上传时出错。"
如果在进行这些更改后仍然遇到问题,请提供有关你的环境(例如,FastAPI 版本、Boto3 版本、Python 版本)和你在尝试上传文件时遇到的任何特定错误消息的更多信息。
标签:python,amazon-s3,boto3,fastapi From: 78795271