Bagaimana hendak Muat Naik Fail Besar (≥3GB) ke FastAPI Backend?
FastAPI boleh memproses fail melebihi 1MB dengan mendapatkan semula bahagian fail pada satu masa daripada badan permintaan. Pendekatan ini menghapuskan keperluan untuk memuatkan keseluruhan fail ke dalam memori, yang disyorkan apabila berurusan dengan fail besar.
Permintaan Sebelah Pelanggan:
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, )
Respons Sebelah Pelayan:
HTTP 422 {"detail":[{"loc":["body","upload_file"],"msg":"field required","type":"value_error.missing"}]}
Sebab untuk Ralat:
Ralat berlaku kerana permintaan pihak klien meninggalkan pengepala Jenis Kandungan. FastAPI menjangkakan pelanggan menghantar permintaan berbilang bahagian/data bentuk semasa memuat naik fail. Tanpa pengepala Jenis Kandungan, FastAPI tidak dapat menghuraikan kandungan permintaan dengan betul.
Penyelesaian 1 (Disyorkan): Menggunakan Muat Naik Fail Penstriman dan Permintaan Dikodkan Potongan
Pustaka HTTPX menyokong muat naik fail penstriman secara lalai, membolehkan anda menghantar fail tanpa memuatkannya sepenuhnya ingatan.
Contoh:
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=' ')
Penyelesaian 2: Menggunakan streaming_form_data Library
Pustaka ini menyediakan penstriman berbilang bahagian/borang -data parser untuk Python, membolehkan anda menghuraikan permintaan multipart/form-data tanpa memuatkan keseluruhan badan permintaan ke dalam ingatan.
Contoh:
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)
Atas ialah kandungan terperinci Bagaimana untuk Muat Naik Fail Besar dengan Berkesan (≥3GB) ke Bahagian Belakang FastAPI?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!