Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Muat Naik Fail Besar dengan Cekap dengan FastAPI?

Bagaimana untuk Muat Naik Fail Besar dengan Cekap dengan FastAPI?

Linda Hamilton
Linda Hamiltonasal
2024-12-02 01:13:11850semak imbas

How to Efficiently Upload Large Files with FastAPI?

Memuat Naik Fail Besar dengan Bahagian Pelayan FastAPI

Pelayan FastAPI boleh mengendalikan muat naik fail besar menggunakan kelas UploadFile. Berikut ialah contoh:

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

Masalah dengan Permintaan Sebelah Pelanggan

Apabila menghantar fail besar daripada klien, isu mungkin timbul disebabkan perkara berikut:

  1. Pengepala data berbilang bahagian/borang: Permintaan pelanggan harus tentukan pengepala Jenis Kandungan sebagai data berbilang bahagian/bentuk, diikuti dengan rentetan sempadan yang diperlukan. Walau bagaimanapun, jika anda tidak menggunakan perpustakaan untuk mengendalikan muat naik fail, anda mesti menetapkan pengepala ini secara manual.
  2. Penggunaan MultipartEncoder: Pastikan MultipartEncoder menyertakan nama fail semasa mengisytiharkan medan untuk upload_file.
  3. Syor Perpustakaan: Menggunakan yang lapuk perpustakaan (cth., tali pinggang alat permintaan) untuk muat naik fail tidak disyorkan. Pertimbangkan untuk menggunakan permintaan Python atau HTTPX sebaliknya, kerana ia memberikan sokongan yang lebih baik untuk muat naik fail yang besar.

Pilihan Lebih Pantas Menggunakan .stream()

Dengan mengakses permintaan body sebagai strim, anda boleh mengelak daripada memuatkan keseluruhan fail ke dalam memori, menghasilkan muat naik yang lebih pantas. Ini boleh dicapai menggunakan kaedah .stream(). Berikut ialah contoh menggunakan pustaka data borang-penstriman:

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)

Pilihan Ganti Menggunakan Muat NaikFail dan Borang

Jika anda lebih suka menggunakan titik akhir def biasa, anda boleh mengendalikan muat naik fail seperti berikut:

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}"}

Meningkatkan Klien HTTPX Tamat masa

Apabila menggunakan perpustakaan HTTPX, anda mungkin perlu meningkatkan tamat masa untuk mengelakkan tamat masa membaca semasa muat naik fail besar.

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

Atas ialah kandungan terperinci Bagaimana untuk Muat Naik Fail Besar dengan Cekap dengan 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