Home > Backend Development > Python Tutorial > How to Effectively Upload Large Files (≥3GB) to a FastAPI Backend?

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

Susan Sarandon
Release: 2024-12-04 15:22:11
Original
459 people have browsed it

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

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

FastAPI can process files exceeding 1MB by retrieving portions of the file at a time from the request body. This approach eliminates the need to load the entire file into memory, which is recommended when dealing with large files.

Client-Side Request:

m = MultipartEncoder(fields = {"upload_file":open(file_name,'rb')})
prefix = "http://xxx:5000"
url = "{}/v1/uploadfiles".format(prefix)
try:
    req = requests.post(
    url,
    data=m,
    verify=False,
            )
Copy after login

Server-Side Response:

HTTP 422 {"detail":[{"loc":["body","upload_file"],"msg":"field required","type":"value_error.missing"}]}
Copy after login

Reason for the Error:

The error occurs because the client-side request omits the Content-Type header. FastAPI expects the client to send multipart/form-data requests when uploading files. Without the Content-Type header, FastAPI cannot correctly parse the request body.

Solution 1 (Recommended): Using Streaming File Uploads and Chunk-Encoded Requests

HTTPX library supports streaming file uploads by default, allowing you to send files without loading them entirely into memory.

Example:

import httpx
import time

url = 'http://127.0.0.1:8000/upload'
files = {'file': open('bigFile.zip', 'rb')}
headers = {'Filename': 'bigFile.zip'}
data = {'data': 'Hello World!'}

with httpx.Client() as client:
    start = time.time()
    r = client.post(url, data=data, files=files, headers=headers)
    end = time.time()
    print(f'Time elapsed: {end - start}s')
    print(r.status_code, r.json(), sep=' ')
Copy after login

Solution 2: Using streaming_form_data Library

This library provides astreaming multipart/form-data parser for Python, allowing you to parse multipart/form-data requests without fully loading the entire request body into memory.

Example:

from streaming_form_data import StreamingFormDataParser
from streaming_form_data.targets import FileTarget, ValueTarget

app = FastAPI()
MAX_REQUEST_BODY_SIZE = 1024 * 1024 * 1024 * 4  # = 4GB
MAX_FILE_SIZE = 1024 * 1024 * 1024 * 3  # = 3GB

@app.post('/upload')
async def upload(request: Request):
    
    parser = StreamingFormDataParser(headers=request.headers)
    filename = request.headers.get('Filename')
    file_ = FileTarget('./' + filename)
    data = ValueTarget()
    parser.register('file', file_)
    parser.register('data', data)
    body_validator = MaxBodySizeValidator(MAX_REQUEST_BODY_SIZE)
    file_validator = MaxSizeValidator(MAX_FILE_SIZE)
    
    async for chunk in request.stream():
        body_validator(chunk)
        parser.data_received(chunk)
Copy after login

The above is the detailed content of How to Effectively Upload Large Files (≥3GB) to a FastAPI Backend?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template