Este artículo registra principalmente la solicitud de datos del formulario y el contenido relacionado, como la carga de archivos de diferentes tamaños, la carga de varios archivos y la obtención de información de archivos.
solicitud de formulario
@app07.post("/stu07/form")
def stu07_form(
param1: str = Form(),
param2: str = Form(),
param3: int = Form()
):
return {
"param1": param1,
"param2": param2,
"param3": param3
}
De acuerdo con los parámetros de ruta y los parámetros de consulta, use el método de formulario integrado de fastapi para declarar;
Subir un archivo de bytes
@app07.post("/stu07/files")
def stu07_files(
file: bytes = File()
):
return {
"files_size": len(file)
}
Los archivos de carga se cargan en forma de Formulario, y el Archivo en el código anterior también se hereda de Formulario;
Si el tipo de parámetro de la función de operación de ruta se declara como
bytes
, FastAPI leerá y recibirá el contenido del archivo en bytes.Este método almacena todo el contenido del archivo en la memoria y es adecuado para archivos pequeños.
Subir archivos usando UploadFile
@app07.post("/stu07/uploadfile/")
def stu07_uploadfile(
file: UploadFile
):
return {
"文件名": file.filename,
"内容类型": file.content_type
}
UploadFile
Comparado conbytes
, tiene más ventajas, es más adecuado para procesar archivos grandes como imágenes, videos, archivos binarios, etc., y la ventaja es que no ocupa toda la memoria;También puede
UploadFile
usar atributos para obtener información relacionada directamente:
filename
: cargue la cadena de nombre de archivo (str), por ejemplo,myimage.jpg
;content_type
: tipo de contenido (tipo MIME/tipo de medio) cadena (str), p. ej.,image/jpeg
;file
:SpooledTemporaryFile
(file-like
objeto). De hecho, esPython
un archivo que se puede pasar directamente a otrasfile-like
funciones o bibliotecas de soporte que esperan objetos.UploadFile admite los siguientes métodos asincrónicos , que (utilizados internamente
SpooledTemporaryFile
) llaman a los métodos de archivo correspondientes.
write(data)
:data (str 或 bytes)
escribir en el archivo;read(size)
(size (int))
: Leer el contenido del archivo por el número especificado de bytes o caracteres ;seek(offset)
: moverse aoffset (int)
la posición del byte del archivo;
- Por ejemplo,
await myfile.seek(0)
vaya al principio del archivo;await myfile.read()
Este método es especialmente útil cuando necesita leer el contenido leído nuevamente después de ejecutar ;close()
: Cierra el archivo.Nota :
Los métodos anteriores son todos
async
métodos y deben usarse con "await";Por ejemplo, en
async
la función de operación de ruta, debe leer el contenido de la siguiente maneracontents = await myfile.read()
En
def
las funciones de operación de rutas ordinarias, puede acceder directamenteUploadFile.file
contents = myfile.file.read()
Carga de archivos opcional
@app07.post("/stu07/optionalfile")
def stu07_optional_file(
file: Optional[bytes] = File(None)
):
if not file:
return {
"message": "未上传文件"}
else:
return {
"filesize": len(file)}
También use Opcional o Unión para configurarlo;
establecer metadatos
@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}
Esta parte del contenido es coherente con los parámetros de ruta y los parámetros de consulta, y se puede configurar de acuerdo con los requisitos;
Subir varios archivos
@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]
}
Para cargar varios archivos, configure el parámetro correspondiente para
List
escribir;
Cargue parámetros de formulario y archivos al mismo tiempo
@app07.post("/stu07/form_file/")
def stu07_form_file(
file: UploadFile,
form: str = Form()
):
return {
"filename": file.filename,
"form": form
}
Carga mixta, es decir, declarar diferentes parámetros en la función de ruta correspondiente;
código fuente
# -*- 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
}
¡Gracias por leer!
Dirección de Jiumozhai: https://blog.jiumoz.com/archives/fastapi-cong-ru-men-dao-shi-zhan-biao-dan-qing-qiu-yu-shang-chuan-wen-jian