FastAPI - 上传文件



首先,要向服务器发送文件,需要将 HTML 表单的 enctype 设为 multipart/form-data,并将 input 类型设为 file 以渲染一个按钮,单击该按钮后,你可以从文件系统中选择文件。

<html>
   <body>
      <form action="https://127.0.0.1:8000/uploader" method="POST" enctype="multipart/form-data">
         <input type="file" name="file" />
         <input type="submit"/>
      </form>
   </body>
</html>

请注意,表单的 action 参数为端点 https://127.0.0.1:8000/uploader,并且 method 设为 POST。

此 HTML 表单使用以下代码作为模板进行渲染 −

from fastapi import FastAPI, File, UploadFile, Request
import uvicorn
import shutil
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/upload/", response_class=HTMLResponse)
async def upload(request: Request):
   return templates.TemplateResponse("uploadfile.html", {"request": request})

访问 https://127.0.0.1:8000/upload/。你应该会看到包含选择文件按钮的表单。单击该按钮以打开要上传的文件。

FastAPI Uploading Files

上传操作由 FastAPI 中的 UploadFile 函数处理

from fastapi import FastAPI, File, UploadFile
import shutil
@app.post("/uploader/")
async def create_upload_file(file: UploadFile = File(...)):
   with open("destination.png", "wb") as buffer:
      shutil.copyfileobj(file.file, buffer)
   return {"filename": file.filename}

在 FastAPI 中我们将使用shutil库将接收到的文件复制到服务器位置,文件名为destination.png

广告