Возможно ли загрузить файл на localhost в FastAPI?

В документации FastAPI есть пример:

from fastapi import FastAPI, File, UploadFile

app = FastAPI()


@app.post("/files/")
async def create_file(file: bytes = File(...)):
    return {"file_size": len(file)}


@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile):
    return {"filename": file.filename}

Хотелось бы загруженный файл сохранить на localhost и иметь к нему доступ по url. Возможно ли это и как это сделать? В сети есть примеры различных манипуляций с файлом через shutil, но этот модуль, как я понимаю, предназначен только для работы с локальными файлами.


Ответы (1 шт):

Автор решения: eri

FastAPI сохраняет файл на диск во временный каталог. После его нужно переместить в папку со статикой.

Через copyfileobj более универсально, но тут файл будет записан на диск 2 раза

# file: UploadFile
with open('путь/к/статике/' + filename, "wb") as wf:
     shutil.copyfileobj(file.file, wf)
     file.file.close() # удалаяет временный

Если временный каталог на том же диске что и хранилище файлов, то можно быстро продублировать через os.link

Для того чтоб файлы стали доступны для скачивания нужно добавить ссылку

app.mount('/uploads', StaticFiles(directory="путь/к/статике/"), name="uploads")
→ Ссылка