Skip to content

Загрузка файлов

FastHTTP поддерживает загрузку файлов через multipart/form-data с помощью параметра files.

Простая загрузка

Передайте байты напрямую:

from fasthttp import FastHTTP
from fasthttp.response import Response

app = FastHTTP()


@app.post(
    url="https://api.example.com/upload",
    files={"file": b"Hello, world!"},
)
async def upload(resp: Response) -> dict:
    return resp.json()

Загрузка с именем файла и типом контента

Передайте кортеж (имя_файла, данные, тип_контента):

@app.post(
    url="https://api.example.com/upload",
    files={"file": ("report.csv", b"name,score\nAlice,95\n", "text/csv")},
)
async def upload_csv(resp: Response) -> dict:
    return resp.json()

Несколько файлов

Передайте словарь с несколькими ключами:

@app.post(
    url="https://api.example.com/upload",
    files={
        "avatar": ("photo.jpg", b"\xff\xd8\xff\xe0...", "image/jpeg"),
        "document": ("resume.pdf", b"%PDF-1.4...", "application/pdf"),
    },
)
async def upload_multi(resp: Response) -> dict:
    return resp.json()

Или используйте список для отправки нескольких файлов под одним именем поля:

@app.post(
    url="https://api.example.com/upload",
    files=[
        ("files", ("a.txt", b"содержимое a", "text/plain")),
        ("files", ("b.txt", b"содержимое b", "text/plain")),
    ],
)
async def upload_list(resp: Response) -> dict:
    return resp.json()

Загрузка с JSON

Сочетайте files с json для отправки метаданных вместе с файлом:

@app.post(
    url="https://api.example.com/upload",
    json={"title": "Моё фото", "tags": ["природа"]},
    files={"file": ("sunset.jpg", b"\xff\xd8\xff\xe0...", "image/jpeg")},
)
async def upload_with_meta(resp: Response) -> dict:
    return resp.json()

Файловый объект

Передайте открытый файловый дескриптор:

@app.post(
    url="https://api.example.com/upload",
    files={"file": open("photo.jpg", "rb")},
)
async def upload_file(resp: Response) -> dict:
    return resp.json()

Path объект

Передайте pathlib.Path:

from pathlib import Path

FILE = Path("photo.jpg")


@app.post(
    url="https://api.example.com/upload",
    files={"file": FILE},
)
async def upload_path(resp: Response) -> dict:
    return resp.json()

Поддерживаемые типы

Параметр files принимает:

Тип Пример
bytes b"данные"
str "текст"
файловый объект open("file.txt", "rb")
Path Path("file.txt")
кортеж (имя, данные) ("file.txt", b"data")
кортеж (имя, данные, тип) ("file.txt", b"data", "text/plain")
словарь имя -> данные {"file": b"data"}
словарь имя -> кортеж {"file": ("f.txt", b"data")}
список кортежей [("f", b"a"), ("f", b"b")]