この記事では主に、フォームのデータリクエストと、異なるサイズのファイルのアップロード、複数のファイルのアップロード、ファイル情報の取得などの関連コンテンツを記録します。
フォームリクエスト
@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 メソッドを使用して宣言します。
バイトファイルをアップロードする
@app07.post("/stu07/files")
def stu07_files(
file: bytes = File()
):
return {
"files_size": len(file)
}
アップロード ファイルは Form の形式でアップロードされ、上記のコードの File も Form から継承されます。
パス操作関数のパラメーターの型が として宣言されている場合
bytes
、FastAPI はファイルの内容をバイト単位で読み取り、受信します。この方法は、ファイルのすべての内容をメモリに保存するため、小さなファイルに適しています。
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
。
SpooledTemporaryFile
UploadFile は、対応するファイル メソッドを(内部的に使用して) 呼び出す次の非同期メソッドをサポートします。
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()
オプションのファイルアップロード
@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 を使用して設定します。
メタデータを設定する
@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]
}
複数のファイルをアップロードするには、対応するパラメータを
List
type に設定します。
フォームパラメータとファイルを同時にアップロードする
@app07.post("/stu07/form_file/")
def stu07_form_file(
file: UploadFile,
form: str = Form()
):
return {
"filename": file.filename,
"form": form
}
混合アップロード。つまり、対応するパス関数で異なるパラメーターを宣言します。
ソースコード
# -*- 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