Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Muat Naik Fail Besar dengan Cekap (≥3GB) ke Bahagian Belakang FastAPI?

Bagaimana untuk Muat Naik Fail Besar dengan Cekap (≥3GB) ke Bahagian Belakang FastAPI?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-28 09:46:12129semak imbas

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

Bagaimana hendak Muat Naik Fail Besar (≥3GB) ke bahagian belakang FastAPI?

Menggunakan Requests-Toolbelt

Apabila menggunakan pustaka requests-toolbelt, pastikan anda menyatakan kedua-dua nama fail dan pengepala Jenis Kandungan semasa mengisytiharkan medan untuk upload_file. Berikut ialah contoh:

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.

Menggunakan Permintaan Python/HTTPX

Pilihan lain ialah menggunakan permintaan Python atau perpustakaan HTTPX, yang kedua-duanya boleh mengendalikan muat naik fail penstriman dengan cekap. Berikut ialah contoh untuk setiap satu:

Menggunakan permintaan:

import requests

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

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

Menggunakan HTTPX:

import httpx

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

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

HTTPX secara automatik menyokong muat naik fail penstriman, manakala permintaan memerlukan anda menetapkan pengepala Jenis Kandungan 'multipart/form-data'.

Menggunakan Kaedah FastAPI Stream()

Kaedah .stream() FastAPI membolehkan anda mengelak daripada memuatkan fail besar ke dalam memori dengan mengakses badan permintaan sebagai strim . Untuk menggunakan pendekatan ini, ikuti langkah berikut:

  1. Pasang pustaka data borang-penstriman: Pustaka ini menyediakan penghurai penstriman untuk data berbilang bahagian/bentuk-data.
  2. Buat titik akhir FastAPI: Gunakan kaedah .stream() untuk menghuraikan kandungan permintaan sebagai strim dan gunakan pustaka ing_form_data strim untuk mengendalikan penghuraian berbilang bahagian/data-bentuk.
  3. Daftar Sasaran: Tentukan objek FileTarget dan ValueTarget untuk mengendalikan penghuraian data fail dan borang, masing-masing.

Pengesahan Saiz Fail yang Dimuat Naik

Untuk memastikan saiz fail yang dimuat naik tidak melebihi had yang ditentukan, anda boleh menggunakan MaxSizeValidator. Berikut ialah contoh:

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)

Melaksanakan Titik Akhir

Berikut ialah contoh titik akhir yang menggabungkan teknik ini:

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!'}

Atas ialah kandungan terperinci Bagaimana untuk Muat Naik Fail Besar dengan Cekap (≥3GB) ke Bahagian Belakang FastAPI?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn