首页 >后端开发 >Python教程 >如何使用FastAPI高效上传大文件?

如何使用FastAPI高效上传大文件?

Linda Hamilton
Linda Hamilton原创
2024-12-02 01:13:11909浏览

How to Efficiently Upload Large Files with FastAPI?

使用 FastAPI 的服务器端上传大文件

FastAPI 服务器可以使用 UploadFile 类处理大文件上传。下面是一个示例:

async def uploadfiles(upload_file: UploadFile = File(...)):
    ...

客户端请求问题

从客户端发送大文件时,可能会因以下原因出现问题:

  1. multipart/form-data 标头:客户端的请求应将 Content-Type 标头指定为 multipart/form-data,后跟必要的边界字符串。但是,如果您不使用库来处理文件上传,则必须手动设置此标头。
  2. MultipartEncoder 用法:确保 MultipartEncoder 在声明 upload_file 字段时包含文件名。
  3. 库推荐:使用过时的库(例如,不建议使用 requests-toolbelt)进行文件上传。考虑使用 Python 请求或 HTTPX,因为它们为大文件上传提供更好的支持。

使用 .stream() 的更快选项

通过访问请求body 作为流,可以避免将整个文件加载到内存中,从而提高上传速度。这可以使用 .stream() 方法来实现。以下是使用streaming-form-data库的示例:

from streaming_form_data import StreamingFormDataParser
from streaming_form_data.targets import FileTarget
request_body = await request.stream()
parser = StreamingFormDataParser(headers=request.headers)
parser.register('upload_file', FileTarget(filepath))
async for chunk in request_body:
    parser.data_received(chunk)

使用UploadFile和Form的替代选项

如果您更喜欢使用常规的def端点,您可以可以处理文件上传如下:

from fastapi import File, UploadFile, Form, HTTPException, status
import aiofiles
import os

CHUNK_SIZE = 1024 * 1024

@app.post("/upload")
async def upload(file: UploadFile = File(...), data: str = Form(...)):
    try:
        filepath = os.path.join('./', os.path.basename(file.filename))
        async with aiofiles.open(filepath, 'wb') as f:
            while chunk := await file.read(CHUNK_SIZE):
                await f.write(chunk)
    except Exception:
        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
                            detail='There was an error uploading the file')
    finally:
        await file.close()

    return {"message": f"Successfuly uploaded {file.filename}"}

增加HTTPX客户端超时

使用HTTPX库时,可能需要增加超时,以防止大文件上传时读取超时。

timeout = httpx.Timeout(None, read=180.0)

以上是如何使用FastAPI高效上传大文件?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn