前端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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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实例来加载、转换和处理数据。我们学习了如何将文本文件加载为…