0Pricing
FastAPI Backend Development Bootcamp · 课时

表单数据与文件上传

处理传统 HTML 表单数据,并使用 FastAPI 的内置功能实现文件上传。

表单数据与文件上传 是 CoddyKit 上的免费 FastAPI Backend Development Bootcamp 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 FastAPI Backend Development Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 FastAPI Backend Development Bootcamp 课程共包含 4 节课。

本课时的部分内容尚未翻译,以英文显示。

Form Data Basics

When you fill out a web form (like a login or registration page) and click "submit," the data you entered is often sent as form data.

This is a traditional way for browsers to send information to a server, different from sending JSON in a request body.

Form data can be sent in two main ways:

  • application/x-www-form-urlencoded: For simple key-value pairs.
  • multipart/form-data: Used when files are involved, or for larger, more complex data.

FastAPI's Form Dependency

FastAPI makes handling form data easy using the Form dependency from fastapi.

It works similarly to Query or Path parameters, but it tells FastAPI to expect the data in the request body as form fields.

You import it like this: from fastapi import FastAPI, Form.

Basic Form Endpoint Example

Let's create an endpoint that accepts a username and password as form data. Notice how username and password are explicitly marked with Form(...).

This tells FastAPI to parse them from the form body, not as JSON or query parameters.

from fastapi import FastAPI, Form
import uvicorn

app = FastAPI()

@app.post("/login/")
async def login(username: str = Form(...), password: str = Form(...)):
    return {"username": username, "message": "Login successful!"}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

Interacting with Form Data

You can test this endpoint using tools like curl or by creating a simple HTML form. The -d flag in curl sends form data.

Make sure your FastAPI application from the previous scene is running!

curl -X POST "http://127.0.0.1:8000/login/" \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -d "username=coddy&password=secret"

File Uploads Explained

Uploading files (like images, documents, or videos) is a common web task. This type of data is sent using multipart/form-data encoding.

FastAPI provides special tools to handle these uploads efficiently, allowing you to access file contents and metadata.

FastAPI's UploadFile

For file uploads, FastAPI uses the UploadFile class (from fastapi) along with the File dependency.

When you declare a parameter with File(...) and type-hint it as UploadFile, FastAPI handles the file stream.

  • filename: The name of the uploaded file.
  • content_type: The file's MIME type (e.g., image/jpeg).
  • file: A SpooledTemporaryFile object, allowing you to read its contents.
from fastapi import FastAPI, File, UploadFile
import uvicorn

app = FastAPI()

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

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

Saving One Uploaded File

After receiving an UploadFile, you can read its content and save it to a local disk or cloud storage. Here's how to save it locally.

Remember to handle potential errors during file operations.

from fastapi import FastAPI, File, UploadFile
import uvicorn
import shutil
import os

app = FastAPI()

# Ensure the 'files' directory exists
os.makedirs("files", exist_ok=True)

@app.post("/uploadandsave/")
async def upload_and_save_file(file: UploadFile = File(...)):
    file_location = f"files/{file.filename}"
    with open(file_location, "wb+") as file_object:
        shutil.copyfileobj(file.file, file_object)
    return {"message": f"File '{file.filename}' saved at '{file_location}'"}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

Uploading Many Files

What if you need to upload several files at once? FastAPI supports this by allowing you to define a parameter as a list of UploadFile.

Each file in the list will be an UploadFile object, which you can then process individually.

from fastapi import FastAPI, File, UploadFile
from typing import List
import uvicorn

app = FastAPI()

@app.post("/uploadmultiple/")
async def create_upload_files(files: List[UploadFile] = File(...)):
    uploaded_filenames = [file.filename for file in files]
    return {"filenames": uploaded_filenames, "message": "Files received!"}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

Saving Multiple Uploads

Similar to single files, you can iterate through the list of UploadFile objects and save each one. This is useful for photo galleries or document uploads.

Always ensure proper error handling and secure file storage practices in a real application.

from fastapi import FastAPI, File, UploadFile
from typing import List
import uvicorn
import shutil
import os

app = FastAPI()

# Ensure the 'files' directory exists
os.makedirs("files", exist_ok=True)

@app.post("/uploadandsavemultiple/")
async def upload_and_save_multiple_files(files: List[UploadFile] = File(...)):
    saved_files = []
    for file in files:
        file_location = f"files/{file.filename}"
        with open(file_location, "wb+") as file_object:
            shutil.copyfileobj(file.file, file_object)
        saved_files.append(file.filename)
    return {"message": f"Successfully uploaded: {', '.join(saved_files)}"}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

Form & File Check

You've learned about handling form data and file uploads. Let's test your understanding!

Lesson Summary

Great job! In this lesson, you mastered how to handle traditional form data and robust file uploads in FastAPI.

  • We used Form(...) for simple key-value form fields.
  • We explored UploadFile and File(...) for single and multiple file uploads.
  • You learned to save uploaded files to your server.

These techniques are crucial for building interactive web applications. Keep practicing!

常见问题解答

「表单数据与文件上传」课时是免费的吗?

是的 — 「表单数据与文件上传」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 FastAPI Backend Development Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 FastAPI Backend Development Bootcamp 课程共包含 4 节课。

「表单数据与文件上传」这节课中我会学到什么?

处理传统 HTML 表单数据,并使用 FastAPI 的内置功能实现文件上传。 你通过在浏览器中直接运行的动手代码来练习 FastAPI Backend Development Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 FastAPI Backend Development Bootcamp 需要有经验吗?

无需任何先前经验。CoddyKit 上的 FastAPI Backend Development Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「表单数据与文件上传」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 FastAPI Backend Development Bootcamp 课中编写并运行代码吗?

能。每节 FastAPI Backend Development Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 用于请求体的 Pydantic 模型
  2. 响应模型与状态码
  3. 表单数据与文件上传
  4. 请求头、Cookie 与自定义响应
← 返回 FastAPI Backend Development Bootcamp