FastAPI desde la entrada hasta el combate real (11): solicitud de formulario y archivo de carga

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;

imagen-20221202182310041

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.

imagen-20221202182443372

Subir archivos usando UploadFile

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

UploadFileComparado con bytes, 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 UploadFileusar 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-likeobjeto). De hecho, es Pythonun archivo que se puede pasar directamente a otras file-likefunciones 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 a offset (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 asyncmétodos y deben usarse con "await";

Por ejemplo, en asyncla función de operación de ruta, debe leer el contenido de la siguiente manera

contents = await myfile.read()

En deflas funciones de operación de rutas ordinarias, puede acceder directamenteUploadFile.file

contents = myfile.file.read()

imagen-20221202182630119

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;

imagen-20221202182723271

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;

imagen-20221202182807495

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 Listescribir;

imagen-20221202182933070

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;

imagen-20221202183039266

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

Supongo que te gusta

Origin blog.csdn.net/qq_45730223/article/details/128167209
Recomendado
Clasificación