首页 >后端开发 >Python教程 >如何高效上传大文件(≥3GB)到FastAPI后端?

如何高效上传大文件(≥3GB)到FastAPI后端?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-28 09:46:12129浏览

How to Efficiently Upload Large Files (≥3GB) to a FastAPI Backend?

如何上传大文件(≥3GB)到FastAPI后端?

使用Requests-Toolbelt

使用requests-toolbelt库时,在声明 upload_file 字段时,请务必指定文件名和 Content-Type 标头。下面是一个示例:

filename = 'my_file.txt'
m = MultipartEncoder(fields={'upload_file': (filename, open(filename, 'rb'))})
r = requests.post(
    url,
    data=m,
    headers={'Content-Type': m.content_type},
    verify=False,
)
print(r.request.headers)  # confirm that the 'Content-Type' header has been set.

使用 Python Requests/HTTPX

另一个选择是使用 Python 的 requests 或 HTTPX 库,它们都可以有效地处理流式文件上传。以下是每个示例:

使用请求:

import requests

url = '...'
filename = '...'

with open(filename, 'rb') as file:
    r = requests.post(
        url,
        files={'upload_file': file},
        headers={'Content-Type': 'multipart/form-data'},
    )

自动使用 HTTPX:

import httpx

url = '...'
filename = '...'

with open(filename, 'rb') as file:
    r = httpx.post(
        url,
        files={'upload_file': file},
    )

HTTPX 自动支持流式文件上传,而请求则需要设置Content-Type header为'multipart/form-data'。

使用 FastAPI Stream() 方法

FastAPI 的 .stream() 方法允许您通过将请求正文作为流访问来避免将大文件加载到内存中。要使用此方法,请按照下列步骤操作:

  1. 安装streaming-form-data 库: 该库为多部分/表单数据数据提供流式解析器。
  2. 创建FastAPI端点:使用.stream()方法将请求体解析为流,并利用该流ing_form_data 库来处理 multipart/form-data 的解析。
  3. 注册目标: 定义 FileTarget 和 ValueTarget 对象来分别处理文件和表单数据解析。

上传文件大小验证

确保上传文件大小符合不超过指定的限制,可以使用 MaxSizeValidator。这是一个示例:

from streaming_form_data import streaming_form_data
from streaming_form_data import MaxSizeValidator

FILE_SIZE_LIMIT = 1024 * 1024 * 1024  # 1 GB

def validate_file_size(chunk: bytes):
    if FILE_SIZE_LIMIT > 0:
        streaming_form_data.validators.MaxSizeValidator( FILE_SIZE_LIMIT). __call__(chunk)

实现端点

这是一个包含这些技术的示例端点:

from fastapi import FastAPI, File, Request
from fastapi.responses import HTMLResponse
from streaming_form_data.targets import FileTarget, ValueTarget
from streaming_form_data import StreamingFormDataParser

app = FastAPI()

@app.post('/upload')
async def upload(request: Request):
    # Parse the HTTP headers to retrieve the boundary string.
    parser = StreamingFormDataParser(headers=request.headers)

    # Register FileTarget and ValueTarget objects.
    file_ = FileTarget()
    data = ValueTarget()
    parser.register('upload_file', file_)
    parser.register('data', data)

    async for chunk in request.stream():
        parser.data_received(chunk)

    # Validate file size (if necessary)
    validate_file_size(file_.content)

    # Process the uploaded file and data.
    return {'message': 'File uploaded successfully!'}

以上是如何高效上传大文件(≥3GB)到FastAPI后端?的详细内容。更多信息请关注PHP中文网其他相关文章!

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