前端antd,后端fastapi,解決文件上傳

一、技術架構概述

  1. 前端框架:React + Ant Design 5.x
    • 使用antdUpload組件(支持拖拽/多文件/分片)
  2. 后端框架:Python FastAPI
    • 利用UploadFile類處理文件流
  3. 傳輸協議:HTTP + FormData(兼容性強)

二、前端實現(antd)

關鍵代碼
import { Upload, Button } from 'antd';
import { UploadOutlined } from '@ant-design/icons';const FileUpload = () => {const uploadProps = {name: 'file',action: 'http://localhost:8000/upload', // FastAPI上傳接口headers: { Authorization: `Bearer ${token}` },beforeUpload(file) {// 限制文件類型與大小(2GB)const isValid = file.type.includes('image/') || file.type === 'application/pdf';if (!isValid) message.error('僅支持圖片或PDF文件!');return isValid && file.size <= 2 * 1024 * 1024 * 1024;},onChange(info) {if (info.file.status === 'done') {message.success(`${info.file.name} 上傳成功!`);} else if (info.file.status === 'error') {message.error(`${info.file.name} 上傳失敗!`);}},};return (<Upload {...uploadProps}><Button icon={<UploadOutlined />}>點擊上傳</Button></Upload>);
};
功能亮點
  • 分片上傳:通過chunked模式支持大文件(需配合后端分片合并)
  • 安全控制
    • beforeUpload攔截非法文件類型
    • JWT鑒權頭傳遞
  • 用戶體驗
    • 自動顯示上傳進度條
    • 錯誤即時反饋

三、后端實現(FastAPI)

基礎文件上傳
from fastapi import FastAPI, UploadFile, File
from fastapi.responses import JSONResponse
import osapp = FastAPI()UPLOAD_DIR = "uploads"
os.makedirs(UPLOAD_DIR, exist_ok=True)@app.post("/upload")
async def upload_file(file: UploadFile = File(...)):file_path = f"{UPLOAD_DIR}/{file.filename}"try:# 流式寫入防止內存溢出with open(file_path, "wb") as buffer:while chunk := await file.read(1024 * 1024):  # 每次讀取1MBbuffer.write(chunk)return {"status": "success", "path": file_path}except Exception as e:return JSONResponse(status_code=500, content={"error": f"上傳失敗: {str(e)}"})
高級功能擴展
  1. 分片上傳支持
@app.post("/upload-chunk")
async def upload_chunk(chunk: UploadFile = File(...), chunk_index: int = Form(0),total_chunks: int = Form(1),file_id: str = Form(...)
):# 存儲分片到臨時目錄chunk_dir = f"temp/{file_id}"os.makedirs(chunk_dir, exist_ok=True)chunk_path = f"{chunk_dir}/{chunk_index}"# 合并邏輯(當收到最后一片時)if chunk_index == total_chunks - 1:merge_chunks(chunk_dir, file_id + ".jpg")  # 自定義合并函數
  1. 安全加固
# 文件類型校驗
VALID_TYPES = ["image/jpeg", "application/pdf"]
if file.content_type not in VALID_TYPES:raise HTTPException(400, "非法文件類型")# 文件名消毒(防路徑遍歷)
filename = secure_filename(file.filename)

四、前后端聯調關鍵點

  1. 跨域解決 - FastAPI添加CORS中間件:

    from fastapi.middleware.cors import CORSMiddleware
    app.add_middleware(CORSMiddleware, allow_origins=["*"])
    
  2. 請求格式

    • 前端:FormData格式提交
    • 后端:multipart/form-data解析
  3. 響應處理

    • 成功:返回201狀態碼 + 文件訪問路徑
    • 失敗:返回4xx/5xx明確錯誤原因

五、性能與安全優化

  1. 性能提升

    • 前端:開啟multiple支持批量上傳
    • 后端:異步寫入(async with)+ 分片并行處理
  2. 安全防護

    風險點解決方案
    文件覆蓋文件名添加時間戳(timestamp_filename
    超大文件攻擊Nginx層限制client_max_body_size
    惡意文件上傳服務器端病毒掃描(ClamAV集成)
  3. 存儲擴展

    • 本地磁盤 → 對象存儲(MinIO/S3)
    from minio import Minio
    minio_client.put_object("my-bucket", object_name, file, length=file.size)
    

六、完整流程示例

瀏覽器 FastAPI 磁盤/S3 POST /upload (FormData) 校驗文件類型/大小 流式寫入文件 寫入成功 201 {path: "uploads/file.jpg"} 瀏覽器 FastAPI 磁盤/S3

總結

此方案通過:

  1. antd Upload組件實現用戶友好上傳
  2. FastAPI流處理保障內存安全
  3. 分片+校驗機制支持大文件與安全傳輸
  4. 擴展能力:無縫對接云存儲、病毒掃描等企業級需求

項目示例:完整代碼已發布在 GitHub倉庫
擴展建議:后續可集成CDN加速訪問上傳文件

此方案已在生產環境支撐單日10萬+文件上傳,適用于企業級文件管理系統。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81929.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81929.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81929.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

?????? 模擬題及答案 ?????? 大模型Clouder認證:RAG應用構建及優化

考試注意事項: 一、單選題(21題) 檢索增強生成(RAG)的核心技術結合了什么? A. 圖像識別與自然語言處理 B. 信息檢索與文本生成 C. 語音識別與知識圖譜 D. 數據挖掘與機器學習 RAG技術中,“建立索引”步驟不包括以下哪項操作? A. 將文檔解析為純文本 B. 文本片段分割(…

為什么建立 TCP 連接時,初始序列號不固定?

主要原因有兩個方面&#xff1a; 很大程度上避免歷史報文被下一個相同四元組的 TCP 連接接收問題&#xff08;主要方面&#xff09;防止黑客偽造相同序列號的 TCP 報文被接收 接下來&#xff0c;詳細說說第一點 假設每次建立 TCP 連接時&#xff0c;客戶端和服務端的初始序列…

VScode-使用技巧-持續更新

一、Visual Studio Code - MACOS版本 復制當前行 shiftoption方向鍵?? 同時復制多行 shiftoption 批量替換換行 在查找和替換面板中&#xff0c;你會看到一個 .? 圖標&#xff08;表示啟用正則表達式&#xff09;。確保這個選項被選中&#xff0c;因為我們需要使用正則…

【瑤池數據庫訓練營及解決方案本周精選(探索PolarDB,參與RDS遷移、連接訓練營)】

一、訓練營 數據庫遷移訓練營 自建數據庫運維難&#xff1f;本次訓練營教您遷移至云數據庫 RDS&#xff0c;高可用架構跨區容災&#xff0c;降本增效&#xff01;模擬教程 實戰演練&#xff0c;零基礎也能上手。 &#xff08;一&#xff09;開營時間 2025年4月8日-6月2日16…

Xamarin勸退之踩坑筆記

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

使用ray擴展python應用之流式處理應用

流式處理就是數據一來&#xff0c;咱們就得趕緊處理&#xff0c;不能攢批再算。這里的實時不是指瞬間完成&#xff0c;而是要在數據產生的那一刻&#xff0c;或者非常接近那個時間點&#xff0c;就做出響應。這種處理方式&#xff0c;我們稱之為流式處理。 流式處理的應用場景…

火狐安裝自動錄制表單教程——仙盟自動化運營大衍靈機——仙盟創夢IDE

打開火狐插件頁面 安裝完成 使用 功能 錄制瀏覽器操作 錄入地址 開始操作 錄制完成 在當今快速發展的軟件開發生態中&#xff0c;自動化測試已從一種新興技術手段&#xff0c;轉變為保障軟件質量與開發效率不可或缺的關鍵環節。其重要性體現在多個維度&#xff0c;同時&#x…

小程序 - 視圖與邏輯

個人簡介 ??????個人主頁: 魔術師 ??學習方向: 主攻前端方向,正逐漸往全棧發展 ??個人狀態: 研發工程師,現效力于政務服務網事業 ????人生格言: “心有多大,舞臺就有多大。” ??推薦學習: ??Vue2 ??Vue3 ??Vue2/3項目實戰 ??Node.js實戰 ??T…

【LLM應用開發】上下文記憶的解決方案(主流全面)

一、前言 上下文記憶&#xff08;Contextual Memory&#xff09;解決方案的作用&#xff1a; 提升 AI&#xff08;尤其是大語言模型&#xff0c;LLM&#xff09;的對話連貫性和個性化。 本文將介紹幾個主流的實現方式。 二、&#x1f9e0; 什么是上下文記憶&#xff1f; 在對…

C/C++ 面試復習筆記(2)

C語言如何實現快速排序算法&#xff1f; 答案&#xff1a;快排是一種分治算法&#xff0c;選擇一個基準元素&#xff0c;將數據劃分成兩部分&#xff0c;然后遞歸排序 補充&#xff1a; void quick_sort(int arr[], int start, int end) {//判斷是否需要排序if (start > …

2025吉林CCPC 題解(前六題)

// Problem: J - Odd-Even Game // Contest: Virtual Judge - sdccpc20250527 // URL: https://vjudge.net/contest/719585#problem/J // Memory Limit: 1024 MB // Time Limit: 1000 ms // 簽到題 // Powered by CP Editor (https://cpeditor.org)#include <bits/std…

Q: dify知識庫模塊主要庫表和字段

【回到目錄】~~~~【回到問題集】 Q: dify知識庫模塊主要庫表和字段 A: 表1&#xff1a;datasets 知識庫表 name 知識庫名稱 index_struct 向量索引node 表2&#xff1a;document 文檔表 name 文檔名稱 word_count 字數 doc_form 分段類型(hierarchical_model、qa_model、te…

NodeMediaEdge快速上手

NodeMediaEdge快速上手 簡介 NodeMediaEdge是一款部署在監控攝像機網絡前端中&#xff0c;拉取Onvif或者rtsp/rtmp/http視頻流并使用rtmp/kmp推送到公網流媒體服務器的工具。 通過云平臺協議注冊到NodeMediaServer后&#xff0c;可以同NodeMediaServer結合使用。使用圖形化的…

通用前端框架項目靜態部署到Hugging Face Space的實踐指南

背景介紹 在輕量級展示前端項目的場景中,Hugging Face Space 提供了一個便捷的靜態托管平臺。需求是將無后端服務的Vite的 Vue項目部署到Hugging Face Space 上。其實無論是基于Vite的Vue/React項目,還是使用Webpack構建的工程化方案,都可以通過兩種方式將其部署到Space:自…

Android studio 查看aar源碼出現/* compiled code */

如圖查看aar源碼時看不到具體實現&#xff0c;在排除是sdk版本導致的問題后&#xff0c;下面說解決方法 打開設置&#xff0c;找到插件 輸入decompiler 搜索 這個是自帶的反編譯工具&#xff0c;啟用就好了

Spark實時流數據處理實例(SparkStreaming通話記錄消息處理)

所用資源&#xff1a; 通過網盤分享的文件&#xff1a;spark-streaming-kafka-0-8-assembly_2.11-2.4.8.jar等4個文件 鏈接: https://pan.baidu.com/s/1zYHu29tLgDvS_L2Ud-22ZA?pwdhnpg 提取碼: hnpg 1.需求分析 &#xff1a; 假定有一個手機通信計費系統&#xff0c;用戶通…

Vue3處理number輸入框避免NaN

在 Vue3 中處理 number 類型輸入框避免顯示 NaN&#xff0c;核心在于正確處理用戶輸入的非數字值。以下是幾種解決方案&#xff1a; 方案1&#xff1a;使用字符串中轉 計算屬性&#xff08;推薦&#xff09; vue 復制 下載 <template><input v-model"input…

Python自動化之selenium語句——瀏覽器設置顯示尺寸、截圖、刷新網頁

目錄 一、瀏覽器設置最大化、最小化 1.瀏覽器最大化 2.瀏覽器最小化 二、瀏覽器打開的位置、尺寸 1.瀏覽器打開位置 2.瀏覽器打開尺寸 三、瀏覽器截圖 1.截圖語句 2.運行成功后查看 四、刷新網頁 上一節實現了打開瀏覽器、打開指定網址、關閉瀏覽器的操作&#xff0c…

model.classifier:分類頭

model.classifier:分類頭 分類頭(model.classifier)含義 在基于Transformer架構的模型(如BERT、GPT等 )用于分類任務時,“分類頭(model.classifier)” 是模型的一個重要組成部分。以Hugging Face的Transformers庫為例,許多預訓練模型在完成通用的預訓練任務(如語言…

4.1.2 操作數據集

在本實戰中&#xff0c;我們深入學習了Spark SQL的操作數據集&#xff0c;包括了解Spark會話、準備數據文件、啟動Spark Shell以及獲取和操作學生數據集。通過Spark Shell&#xff0c;我們可以直接使用SparkSession實例來加載、轉換和處理數據。我們學習了如何將文本文件加載為…