Параметр загрузки файлов, используемый для получения File и UploadFile
Сначала установите python-multipart
。
pip install python-multipart
File
File Это наследование Форма, позволяющая определить Form Те же метаданные плюс дополнительная проверка
от fastapi
импортировать File
from fastapi import FastAPI, File
app = FastAPI()@app.post("/files/")async def create_file(file: bytes = File()):
return {"file_size": len(file)}
File
параметрФайл загружается как «данные формы».
если ПучокФункция управления траекториейпараметризтипобъявлен как bytes
,FastAPI будет bytes
Форма читает и получает содержимое файла.
Создать файл(File
)параметриз Способи Body
и Form
Такой же:
from fastapi import FastAPI, File
@app.post("/files/")async def create_file(file: bytes = File()):
return {"file_size": len(file)}
Интерфейс загрузки тестового файла почтальона
Чтобы сохранить файл локально, вы можете использовать метод open.
@app.post("/files/")
async def create_file(file: bytes = File()):
# Сохранить файл локально
with open("xx.jpg", "wb") as f:
f.write(file)
return {"file_size": len(file)}
File
напрямую наследуется от Form
сорт.
Внимание, от fastapi
импортироватьиз Query
、Path
、File
и т. д. на самом деле являются функциями, возвращающими определенный класс.
Объявление тела файла должно использовать
File
,в противном случае,FastAPI Будет Пучок параметра в качестве параметра запроса или параметра тела запроса (JSON).
Этот метод сохраняет все содержимое файла в памяти и подходит для небольших файлов.
но,во многих случаях,UploadFile
Лучше использовать.
UploadFile
параметр fromдокументопределениедокументпараметрчасиспользовать UploadFile
:
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/uploadfile/")async def create_upload_file(file: UploadFile):
return {"filename": file.filename}
тестовый интерфейс почтальона
UploadFile
и bytes
Он имеет больше преимуществ, чем:
spooled
документ:async
интерфейс;SpooledTemporaryFile
объект, может быть передан непосредственно в другие ожидаемые «файлоподобные» библиотеки объектов.UploadFile
Свойства следующие:
filename
:
загрузитьдокументимянить(str
),Например, myimage.jpg
;content_type
:
Тип контента (MIME тип / СМИтип)нить(str
),Например,image/jpeg
;file
:
SpooledTemporaryFile
( file-like объект)。
На самом деле это Файлы Python, которые можно передавать непосредственно другим ожидаемым file-like
функция объектиз или библиотека поддержки.UploadFile
Поддержите следующее async
метод (с использованием внутреннего SpooledTemporaryFile
)Могу позвонить в соответствующееиздокументметод。
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()
использовать async
методчас,FastAPI Выполните файловый метод в пуле потоков и await
Операция завершена.
Скачать файл
@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile):
file_content = await file.read() # прочитать файл
with open("aa.jpg", "wb") as f:
f.write(file_content)
return {
"filename": file.filename,
"content_type": file.content_type
}
FastAPI из
UploadFile
непосредственно унаследовано от Starlette изUploadFile
,но добавил некоторые необходимые функции,сделай этои Pydantic и FastAPI Совместим с другими деталями.
Параметр файла можно сделать необязательным, используя аннотацию стандартного типа и выбрав None в качестве значения по умолчанию:
@app.post("/uploadfile/")
async def create_upload_file( file: Union[UploadFile, None] = None):
if not file: return {"message": "No upload file sent"} else: return {"filename": file.filename}
установить файл документ Необходимые предметы
file: UploadFile = File(...)
UploadFile
Вы также можете использовать File()
и UploadFile
Вместеиспользовать,Например,Установите дополнительные параметры:
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/files/")
async def create_file(file: bytes = File(description="A file read as bytes")):
return {"file_size": len(file)}
@app.post("/uploadfile/")async def create_upload_file(
file: UploadFile = File(description="A file read as UploadFile"),
):
return {"filename": file.filename}