エントリーから実戦までのFastAPI (11) - フォームリクエストとファイルアップロード

この記事では主に、フォームのデータリクエストと、異なるサイズのファイルのアップロード、複数のファイルのアップロード、ファイル情報の取得などの関連コンテンツを記録します。

フォームリクエスト

@app07.post("/stu07/form")
def stu07_form(
        param1: str = Form(),
        param2: str = Form(),
        param3: int = Form()
):
    return {
    
    
        "param1": param1,
        "param2": param2,
        "param3": param3
    }

パス パラメーターとクエリ パラメーターと一貫して、fastapi の組み込み Form メソッドを使用して宣言します。

画像-20221202182310041

バイトファイルをアップロードする

@app07.post("/stu07/files")
def stu07_files(
        file: bytes = File()
):
    return {
    
    
        "files_size": len(file)
    }

アップロード ファイルは Form の形式でアップロードされ、上記のコードの File も Form から継承されます。

パス操作関数のパラメーターの型が として宣言されている場合bytes、FastAPI はファイルの内容をバイト単位で読み取り、受信します。

この方法は、ファイルのすべての内容をメモリに保存するため、小さなファイルに適しています。

画像-20221202182443372

UploadFile を使用してファイルをアップロードする

@app07.post("/stu07/uploadfile/")
def stu07_uploadfile(
        file: UploadFile
):
    return {
    
    
        "文件名": file.filename,
        "内容类型": file.content_type
    }

UploadFileと比較するとbytes、画像、ビデオ、バイナリ ファイルなどの大きなファイルの処理に適しており、すべてのメモリを占有しないという利点があります。

UploadFile属性を使用して関連情報を直接取得することもできます

  • filename: アップロード ファイル名文字列 (str)、例: myimage.jpg;
  • content_type: コンテンツ タイプ (MIME タイプ/メディア タイプ) 文字列 (str)、例: image/jpeg;
  • file: SpooledTemporaryFile(file-likeオブジェクト)。実際、これはオブジェクトを必要とするPython他の関数またはサポート ライブラリに直接渡すことができるファイルですfile-like

SpooledTemporaryFileUploadFile は、対応するファイル メソッドを(内部的に使用して) 呼び出す次の非同期メソッドをサポートします。

  • write(data):data (str 或 bytes)ファイルに書き込みます。
  • read(size):指定されたバイト数または文字数で(size (int))ファイルの内容を読み取ります。
  • seek(offset):offset (int)ファイルバイトの位置に移動します。
    • たとえば、await myfile.seek(0)ファイルの先頭に移動します。
    • この方法は、を実行したawait myfile.read()後に読み取った内容を再度読み取る必要がある場合に特に便利です。
  • close(): ファイルを閉じます。

:

上記のメソッドはすべてasyncメソッドであり、「await」とともに使用する必要があります。

たとえば、asyncパス操作関数では、次のように内容を読み取る必要があります。

contents = await myfile.read()

通常のdefパス操作関数では、直接アクセスできます。UploadFile.file

contents = myfile.file.read()

画像-20221202182630119

オプションのファイルアップロード

@app07.post("/stu07/optionalfile")
def stu07_optional_file(
        file: Optional[bytes] = File(None)
):
    if not file:
        return {
    
    "message": "未上传文件"}
    else:
        return {
    
    "filesize": len(file)}

また、Optional または Union を使用して設定します。

画像-20221202182723271

メタデータを設定する

@app07.post("/stu07/uploadfile/metadata/")
def stu07_uploadfile_metadata(
        file: UploadFile = File(None, description="一个UploadFile文件")
):
    if not file:
        return {
    
    "message": "未上传文件"}
    else:
        return {
    
    "filename": file.filename}

コンテンツのこの部分は、パス パラメーターおよびクエリ パラメーターと一致しており、要件に従って設定できます。

画像-20221202182807495

複数のファイルをアップロードする

@app07.post("/stu07/fileslist")
def stu07_files_list(
        byteslist: List[bytes] = File(...),
        uploadfilelist: List[UploadFile] = File(...)
):
    return {
    
    
        "bytes_files_size": [len(file) for file in byteslist],
        "upload_filesname": [file.filename for file in uploadfilelist]
    }

複数のファイルをアップロードするには、対応するパラメータをListtype に設定します。

画像-20221202182933070

フォームパラメータとファイルを同時にアップロードする

@app07.post("/stu07/form_file/")
def stu07_form_file(
        file: UploadFile,
        form: str = Form()
):
    return {
    
    
        "filename": file.filename,
        "form": form
    }

混合アップロード。つまり、対応するパス関数で異なるパラメーターを宣言します。

画像-20221202183039266

ソースコード

# -*- coding: utf-8 -*-
# @Time: 2022/11/30 18:09
# @Author: MinChess
# @File: stu07.py
# @Software: PyCharm
from fastapi import APIRouter, Form, File, UploadFile
from typing import List, Optional
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
from datetime import datetime

app07 = APIRouter()


# 一个form请求
@app07.post("/stu07/form")
def stu07_form(
        param1: str = Form(),
        param2: str = Form(),
        param3: int = Form()
):
    return {
    
    
        "param1": param1,
        "param2": param2,
        "param3": param3
    }


# 上传一个bytes类型的文件
@app07.post("/stu07/files")
def stu07_files(
        file: bytes = File()
):
    return {
    
    
        "files_size": len(file)
    }


# 使用UploadFile
@app07.post("/stu07/uploadfile/")
def stu07_uploadfile(
        file: UploadFile
):
    return {
    
    
        "文件名": file.filename,
        "内容类型": file.content_type
    }


# 可选文件上传
@app07.post("/stu07/optionalfile")
def stu07_optional_file(
        file: Optional[bytes] = File(None)
):
    if not file:
        return {
    
    "message": "未上传文件"}
    else:
        return {
    
    "filesize": len(file)}


# 设置UploadFile元数据
@app07.post("/stu07/uploadfile/metadata/")
def stu07_uploadfile_metadata(
        file: UploadFile = File(None, description="一个UploadFile文件")
):
    if not file:
        return {
    
    "message": "未上传文件"}
    else:
        return {
    
    "filename": file.filename}


# 多文件上传
@app07.post("/stu07/fileslist")
def stu07_files_list(
        byteslist: List[bytes] = File(...),
        uploadfilelist: List[UploadFile] = File(...)
):
    return {
    
    
        "bytes_files_size": [len(file) for file in byteslist],
        "upload_filesname": [file.filename for file in uploadfilelist]
    }


# 同时上传表单和文件
@app07.post("/stu07/form_file/")
def stu07_form_file(
        file: UploadFile,
        form: str = Form()
):
    return {
    
    
        "filename": file.filename,
        "form": form
    }


読んでくれてありがとう!

Jiumozhai アドレス: https://blog.jiumoz.com/archives/fastapi-cong-ru-men-dao-shi-zhan-biao-dan-qing-qiu-yu-shang-chuan-wen-jian

おすすめ

転載: blog.csdn.net/qq_45730223/article/details/128167209