news 2026/2/15 11:42:26

Vue3+Node.js实现文件上传并发控制与安全防线 进阶篇

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3+Node.js实现文件上传并发控制与安全防线 进阶篇

上一篇我们实现了最基础的 FormData 上传,体会了前后端的基础联调。但如果在面试中被问到:“如果用户上传了一个 10GB 的文件怎么办?”或者“用户同时选了 100 张图片,浏览器卡死怎么办?”这就需要用到进度监听、双端校验与并发控制。

1 核心概念

文件校验
需要遵循“前端防误操作,后端防恶意攻击”的原则,分为三个层级:

  • 第一层:前端 JS 校验 通过 input 标签属性和 JavaScript 读取 file.size 与 file.type。

  • 第二层:后端请求头校验 使用 Node.js 的 multer 中间件,读取 HTTP 请求头中的 Content-Type 和限制文件流大小。能拦截超大文件,防止服务器内存溢出。

  • 第三层:文件二进制校验 读取文件底层二进制数据的前 8 个字节,与标准文件类型的十六进制码进行比对。这是最高级别的安全校验。无论用户怎么改后缀、改请求头,文件底层的二进制编码是无法伪造的。

并发控制
如果不做控制,直接通过 Promise.all 一次性发送 100 个文件,会导致两个严重问题:

  • 浏览器 TCP 连接限制, Chrome 浏览器规定,对同一个域名最多只能同时维持 6 个网络连接。多出的 94
    个请求会被强制挂起(Pending)。排队时间过长会导致后面的请求直接超时(Timeout)断开。

  • 前端内存占用过高100 个大文件的 FormData 实例会瞬间占满内存,触发浏览器垃圾回收(GC),直接导致页面卡死。

2 前端实现:进度条与取消请求

我们需要使用 Axios/XHR 而不是 fetch, 因为 fetch 具有局限性。fetch API 设计上不支持监听上传进度(只能通过 response.body.getReader() 监听下载进度)。要实现上传进度条,底层必须依赖 XMLHttpRequest 的 upload.onprogress 事件,这也是我们选用 Axios 的原因。
在前端,我们给 Axios 配置 onUploadProgress 来获取进度。同时,利用现代 JS 的 AbortController 来实现“取消上传”功能

<script setup lang="ts">importaxiosfrom'axios'import{ref}from'vue'constselectedFile=ref<File|null>(null)constmessage=ref('')constprogress=ref(0)// 定义中断控制器letabortController:AbortController|null=nullconstuploadFile=async()=>{if(!selectedFile.value)return// 1. 前端基础校验:大小限制 10MBif(selectedFile.value.size>10*1024*1024){message.value='文件不能超过 10MB'return}constformData=newFormData()formData.append('file',selectedFile.value)abortController=newAbortController()try{message.value='正在上传...'constres=awaitaxios.post('http://localhost:3000/upload',formData,{signal:abortController.signal,// 绑定取消信号// 监听上传进度onUploadProgress:(progressEvent)=>{if(progressEvent.total){progress.value=Math.round((progressEvent.loaded*100)/progressEvent.total)}}})message.value=`上传成功:${res.data.filename}`}catch(error:any){// 捕获取消操作的特殊错误if(axios.isCancel(error)){message.value='上传已取消'}else{message.value=error.response?.data?.msg||'上传失败'}}}// 取消上传的触发函数constcancelUpload=()=>{if(abortController)abortController.abort()}</script>

在 Vue 3 中,不要把 File 对象直接放到 reactive 里,这会导致性能问题。使用 ref 并通过 .value 操作即可。

3 后端实现:多文件与拦截器(实现并发和安全防线)

后端我们继续使用 Multer,但这次升级为 upload.array() 以支持多文件,并加上了 limits 和 fileFilter。这一步体现了后端对内存和存储的保护。

constmulter=require("multer");// 配置安全防线:文件过滤器constfileFilter=(req,file,cb)=>{constallowedTypes=["image/jpeg","image/png","application/pdf"];if(allowedTypes.includes(file.mimetype)){cb(null,true);// 放行}else{cb(newError("仅支持 JPG/PNG/PDF 文件"),false);// 拒绝}};constupload=multer({storage:storage,fileFilter:fileFilter,limits:{fileSize:10*1024*1024,// 限制单文件最大 10MBfiles:5// 限制单次请求最多 5 个文件}});// 使用 upload.array 接收多文件,字段名为 "files"app.post("/upload",upload.array("files",5),(req,res)=>{res.json({msg:"上传成功",files:req.files.map(f=>f.filename)// 返回所有文件的名字});});
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/14 14:02:00

学校教室多功能布局平面图在线设计的实用技巧和方法

在教育多元化发展的当下&#xff0c;学校教室早已不再是单一的“授课空间”&#xff0c;而是需要兼顾知识传授、小组协作、实践操作、活动开展等多重需求的多功能场景。一套科学合理的教室布局平面图&#xff0c;不仅能提升空间利用率&#xff0c;还能适配不同教学模式&#xf…

作者头像 李华
网站建设 2026/2/14 7:48:52

智能交通管理:实时路况优化与拥堵预测

一、引言 随着城市化进程的加速与机动车保有量的持续攀升&#xff0c;交通拥堵已成为制约城市发展、影响居民出行体验的核心痛点。传统交通管理模式依赖固定信号配时、人工调度与事后处置&#xff0c;面对潮汐车流、突发事故等动态场景时响应滞后&#xff0c;难以实现路网资源…

作者头像 李华
网站建设 2026/2/11 19:47:58

【Python自动化】不懂代码怎么批量修图?这款 AI 工具把“脚本思维”封装成了傻瓜式软件!

Python 自动化办公 零代码 批量图片处理 跨境电商工具 效率提升 AI翻译摘要在跨境电商圈&#xff0c;“自动化运营”已成为提升人效的关键。很多卖家都知道 Python 脚本可以实现图片的批量采集、OCR 识别和翻译&#xff0c;但对于绝大多数非技术背景的运营人员来说&#xff0c;…

作者头像 李华
网站建设 2026/2/14 3:49:16

大模型面试真题解析+学习路线图,附200本PDF书籍和100套商业方案_AGI大模型面经汇总,太全了!

文章汇总了字节、饿了么、网易等多家大厂的大模型算法面试经验&#xff0c;涵盖Transformer原理、LLaMA结构、位置编码等技术问题&#xff0c;以及算法题解答。同时分享了系统化的AI大模型学习路径&#xff0c;从基础理论到实际应用&#xff0c;包括提示词工程、平台开发、知识…

作者头像 李华
网站建设 2026/2/14 19:32:25

【2026最新】大模型面试全攻略:23家科技公司面试经验+高频考点总结,助你轻松上岸

本文详细记录了作者对23家大模型相关公司的面试经历&#xff0c;包括智元机器人、面壁科技、Minimax、阿里夸克、蚂蚁等公司的面试流程与结果。作者总结了大模型面试的高频考点&#xff0c;如多头注意力机制、框架并行方式、BERT/GPT模型细节、大模型训练技巧等&#xff0c;并分…

作者头像 李华
网站建设 2026/2/14 3:55:22

提示设计用户协作全流程检查清单(架构师版)

提示设计用户协作全流程检查清单&#xff08;架构师版&#xff09;&#xff1a;从“模糊需求”到“持续迭代”的系统导航 引言&#xff1a;AI时代&#xff0c;提示设计是“用户-模型-系统”的翻译官 在AI应用的价值链条中&#xff0c;提示设计&#xff08;Prompt Engineering…

作者头像 李华