news 2026/6/10 1:17:08

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/6/10 7:42:35

人群仿真软件:Vadere_(6).Vadere中的障碍物设置

障碍物设置 在人群仿真软件Vadere中&#xff0c;障碍物的设置对于模拟真实环境中的各种情况至关重要。障碍物可以是墙壁、柱子、家具等&#xff0c;这些障碍物会影响行人的行走路径和行为。本节将详细介绍如何在Vadere中设置障碍物&#xff0c;包括障碍物的定义、添加、编辑和…

作者头像 李华
网站建设 2026/6/10 7:55:55

免费工艺流程模板下载_在线编辑建筑/汽车/物流工艺流程图图表

良功绘图网站 (https://www.lghuitu.com ) 在建筑、汽车、物流等行业的日常运营与项目推进中&#xff0c;工艺流程可视化是提升效率、规范管理的核心手段。无论是建筑工程的施工管控、汽车制造的生产线优化&#xff0c;还是物流行业的仓储配送调度&#xff0c;一份清晰、规范的…

作者头像 李华
网站建设 2026/6/9 23:20:16

AI金融风控:智能反欺诈与个性化理财

一、AI金融风控的核心价值与行业背景 随着数字金融的快速迭代&#xff0c;金融欺诈手段呈现智能化、隐蔽化、团伙化趋势&#xff0c;传统风控模式面临严峻挑战。2023年某电商平台披露数据显示&#xff0c;全年因恶意刷单、账号盗刷等造成的损失超2.3亿元&#xff0c;某银行信用…

作者头像 李华
网站建设 2026/6/10 7:53:14

MCP与A2A深度解析:AI系统集成与智能体协作的未来之路

MCP与A2A是AI系统集成的两大关键协议。MCP解决AI安全调用工具与数据的问题&#xff0c;提供资源、工具和提示模板三大能力&#xff1b;A2A则规范智能体间的协作&#xff0c;通过任务、消息和产物等组件实现高效接力。它们共同构成AI系统的分层规范&#xff0c;将开发范式从&quo…

作者头像 李华
网站建设 2026/6/10 8:57:47

网络考试点下一步出错怎么办?试试这样做

场景&#xff1a;家中网络课学习完毕考试&#xff0c;遇到点下一步出错问题 解决方案&#xff1a;打开显示所有题号的面板&#xff0c;点击面板上的题号跳转 注&#xff1a;我这里题号面板是点击进度条打开的&#xff0c;各人根据实际情况找下

作者头像 李华
网站建设 2026/6/9 20:09:44

抖店商品图如何保存到手机上的方法

抖音小店图片提取保存下载的方法如下&#xff1a; 方案一&#xff1a;借助傻瓜式工具【电商素材提取器】 打开抖音商城&#xff1a; 首先&#xff0c;打开抖音APP并进入“商城”页面。 找到所需商品并点击详情&#xff1a; 在商城中&#xff0c;浏览或搜索找到你希望提取图片…

作者头像 李华