最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python如何使用FastAPI玩轉(zhuǎn)文件上傳功能

 更新時間:2025年06月18日 11:04:51   作者:源滾滾編程  
在Web開發(fā)中,文件上傳是剛需功能,FastAPI憑借異步架構(gòu)和類型提示,讓文件上傳既簡潔又強大,下面小編就來和大家詳細(xì)講講如何使用FastAPI玩轉(zhuǎn)文件上傳功能吧

一核心武器:UploadFile和File()

FastAPI處理文件上傳只需兩個關(guān)鍵組件:

from fastapi import FastAPI, UploadFile, File

app = FastAPI()

???????@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):  # 
    return {"filename": file.filename}

關(guān)鍵解析:

  • UploadFile:智能文件對象,自動處理內(nèi)存/磁盤存儲切換,適合大文件
  • File(...):聲明表單文件字段,...表示參數(shù)必填

優(yōu)勢對比:

  • bytes = File():適合小文件(默認(rèn)上限1MB),直接讀入內(nèi)存
  • UploadFile:支持大文件流式處理,自帶異步接口

二上傳實戰(zhàn)四步曲

1. 基礎(chǔ)保存:直接寫入磁盤

import shutil

???????@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
    with open(file.filename, "wb") as buffer:
        shutil.copyfileobj(file.file, buffer)  # 
    return {"status": "success"}

2. 流式處理:應(yīng)對大文件

@app.post("/large-upload/")
async def large_upload(file: UploadFile):
    with open(file.filename, "wb") as f:
        while chunk := await file.read(1024 * 1024):  # 每次讀取1MB
            f.write(chunk)  # 

為何更優(yōu):避免單次讀取導(dǎo)致內(nèi)存溢出

3. 文件元信息:一鍵獲取關(guān)鍵數(shù)據(jù)

@app.post("/meta-upload/")
async def meta_upload(file: UploadFile):
    return {
        "文件名": file.filename,
        "類型": file.content_type,  # 如image/png
        "大小": f"{file.size / 1024:.2f} KB"  # 
    }

4. 多文件上傳:一次接收多個

@app.post("/multi-upload/")
async def multi_upload(files: list[UploadFile] = File(...)):  # ?? 注意list
    return {"count": len(files), "names": [f.filename for f in files]}

三安全加固:限制與校驗

1. 文件類型過濾

ALLOWED_TYPES = ["image/jpeg", "image/png"]

@app.post("/safe-upload/")
async def safe_upload(file: UploadFile):
    if file.content_type not in ALLOWED_TYPES:
        raise HTTPException(400, "僅支持JPG/PNG格式")  # 

2. 文件大小控制

@app.post("/size-limit/")
async def size_limit(
    file: UploadFile = File(..., max_size=100_000_000)  # 限制100MB
):
    ...  # 

3. 文件名消毒

import re

def sanitize_filename(filename: str) -> str:
    return re.sub(r"[^\w\.]", "", filename)  # 移除非法字符

# 使用:sanitized_name = sanitize_filename(file.filename)

四高階技巧:性能與體驗優(yōu)化

1. 臨時文件處理

import tempfile


@app.post("/temp-upload/")
async def temp_upload(file: UploadFile):
    with tempfile.NamedTemporaryFile(delete=False, suffix=".tmp") as tmp:
        shutil.copyfileobj(file.file, tmp)
        tmp_path = tmp.name  # 獲取臨時文件路徑
    # ...后續(xù)處理

2. 客戶端調(diào)用示例

CURL命令:

curl -X POST "http://localhost:8000/upload/" \
  -H "Content-Type: multipart/form-data" \
  -F "file=@cat.jpg"  # 

Python Requests調(diào)用:

import requests
url = "http://localhost:8000/upload/"
files = {"file": open("cat.jpg", "rb")}
response = requests.post(url, files=files)  # 

3. 文檔增強技巧

給Swagger文檔添加文件說明:

@app.post("/upload/", 
    summary="上傳文件",
    description="支持圖片/文檔,最大100MB",
    response_description="返回文件名和大小"
)
async def upload_file(...): ...

五避坑指南(血淚總結(jié)?。?/h2>

1.遺忘python-multipart

必須安裝:pip install python-multipart,否則報錯Form data parsing error

2.同步阻塞寫入

  • 避免:content = file.file.read()(大文件卡死進(jìn)程)
  • 正確:await file.read() 異步讀取

3.文件覆蓋風(fēng)險

多人上傳同名文件時,采用唯一命名:

import uuid
filename = f"{uuid.uuid4()}_{file.filename}"

4.跨平臺路徑陷阱

使用pathlib處理路徑:

from pathlib import Path
save_path = Path("uploads") / sanitize_filename(file.filename)

到此這篇關(guān)于Python如何使用FastAPI玩轉(zhuǎn)文件上傳功能的文章就介紹到這了,更多相關(guān)Python FastAPI文件上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python調(diào)用Matplotlib繪制振動圖、箱型圖和提琴圖

    Python調(diào)用Matplotlib繪制振動圖、箱型圖和提琴圖

    Matplotlib作為用于數(shù)據(jù)可視化的Python軟件包,能夠繪制多種2D圖像,它使用簡單、代碼清晰易懂,深受廣大技術(shù)愛好者喜愛。本文主要介紹了通過?Matplotlib繪制振動圖、箱型圖、提琴圖,需要的朋友可以參考一下
    2021-12-12
  • PyQt5 matplotlib畫圖不刷新的解決方案

    PyQt5 matplotlib畫圖不刷新的解決方案

    這篇文章主要介紹了PyQt5 matplotlib畫圖不刷新的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python測試函數(shù)出現(xiàn)AssertionError:None?!=?‘Janis?Joplin‘問題及解決

    Python測試函數(shù)出現(xiàn)AssertionError:None?!=?‘Janis?Joplin‘問題及解決

    這篇文章主要介紹了Python測試函數(shù)出現(xiàn)AssertionError:None?!=?‘Janis?Joplin‘問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Pandas數(shù)據(jù)處理庫畫圖與文件讀取使用示例

    Pandas數(shù)據(jù)處理庫畫圖與文件讀取使用示例

    這篇文章主要為大家介紹了Pandas數(shù)據(jù)處理庫畫圖與文件讀取使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • python通過PyQt5實現(xiàn)登錄界面的示例代碼

    python通過PyQt5實現(xiàn)登錄界面的示例代碼

    本文主要介紹了python通過PyQt5實現(xiàn)登錄界面的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Django實現(xiàn)跨域的2種方法

    Django實現(xiàn)跨域的2種方法

    這篇文章主要介紹了Django實現(xiàn)跨域的2中方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • Python檢測網(wǎng)站鏈接是否已存在

    Python檢測網(wǎng)站鏈接是否已存在

    Python是一種解釋型、面向?qū)ο?、動態(tài)數(shù)據(jù)類型的高級程序設(shè)計語言。通過本文給大家介紹Python檢測網(wǎng)站鏈接是否已存在的相關(guān)內(nèi)容,需要的朋友一起學(xué)習(xí)吧
    2016-04-04
  • Python 列表映射后的平均值

    Python 列表映射后的平均值

    這篇文章主要介紹了Python 列表映射后的平均值,下面文章將圍繞Python 列表映射后的平均值得相關(guān)資料展開詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • Mininconda3安裝和使用的具體步驟

    Mininconda3安裝和使用的具體步驟

    Anaconda和Miniconda是Python的兩個流行發(fā)行版,Miniconda是Anaconda的精簡版,Miniconda體積小很多,啟動速度超快,非常適合那些只需要基礎(chǔ)功能的用戶,下面就來介紹一下具體使用,感興趣的可以了解一下
    2025-08-08
  • Python 如何提高元組的可讀性

    Python 如何提高元組的可讀性

    這篇文章主要介紹了Python 如何提高元組的可讀性,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08

最新評論

郁南县| 桓仁| 同仁县| 长乐市| 东乌| 子洲县| 大姚县| 甘南县| 徐水县| 定安县| 桦川县| 荣昌县| 沁水县| 澄迈县| 科技| 新密市| 措勤县| 盘山县| 永川市| 府谷县| 万荣县| 开封市| 惠来县| 留坝县| 白河县| 土默特右旗| 织金县| 五台县| 清流县| 瑞金市| 成都市| 南澳县| 德阳市| 兴业县| 茶陵县| 长宁县| 江安县| 株洲县| 潜江市| 济宁市| 威海市|