news 2026/4/18 7:57:38

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/4/18 7:36:38

第二周作业wp

第二周作业wp [SWPUCTF 2021 新生赛]easyupload3.0 题目提示已经很明显了&#xff0c;我们要提交一个.jpg的文件。那么我们就把一个木马文件做成jpg文件。 这里我们把文件成功上传&#xff0c;然后通过蚁剑连接 连接之后&#xff0c;寻找flag。 如图&#xff0c;成功找到。 2…

作者头像 李华
网站建设 2026/4/18 3:48:15

吐血推荐专科生必用TOP9AI论文网站

吐血推荐专科生必用TOP9AI论文网站 2026年专科生论文写作工具测评&#xff1a;为何需要一份精准榜单&#xff1f; 随着AI技术在教育领域的深入应用&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上五花八门的论文辅助平台&#xff0c;…

作者头像 李华
网站建设 2026/4/17 18:03:57

提升效率:如何为企业挑选完美的RFID解决方案

在物联网赋能企业数字化转型的进程中&#xff0c;RFID&#xff08;射频识别&#xff09;技术凭借非接触式批量读取、数据实时上传、标签抗磨损等核心优势&#xff0c;已成为物流仓储、智能制造、零售管控等领域提升效率的关键抓手。然而&#xff0c;多数企业在选型时易陷入“参…

作者头像 李华
网站建设 2026/4/18 3:49:26

智能座舱:汽车内饰的交互革命

一、引言&#xff1a;从交通工具到第三空间的本质变革 汽车产业的百年演进中&#xff0c;座舱始终是连接人与车的核心载体。从最初仅满足驾乘功能的机械空间&#xff0c;到如今集成人工智能、物联网、显示技术的智能终端&#xff0c;座舱的进化史本质上是一部人机交互的革命史。…

作者头像 李华
网站建设 2026/4/18 3:51:18

柔性生产:小批量定制与大规模生产的完美融合

一、生产模式的时代演进&#xff1a;从规模标准化到柔性协同化 工业革命以来&#xff0c;生产模式的变革始终围绕着“效率”与“需求”的平衡不断迭代。上世纪初&#xff0c;福特汽车开创的流水线大规模生产模式&#xff0c;以标准化产品、专业化分工和连续性作业为核心&#x…

作者头像 李华
网站建设 2026/4/17 23:09:03

厂房车间设备摆放平面图在线绘制的规范要求和模板大全

在工业生产领域&#xff0c;厂房车间设备摆放平面图是连接生产规划与实际落地的关键技术文档。它不仅直观呈现了车间内设备、通道、仓储区域、安全设施等核心要素的空间布局&#xff0c;更直接影响生产流程的顺畅性、空间利用效率、操作人员安全以及后续产能扩展的可行性。无论…

作者头像 李华