动态筛选文件,跳过已删除项方法分享
时间:2026-01-27 17:33:37 339浏览 收藏
“纵有疾风来,人生不言弃”,这句话送给正在学习文章的朋友们,也希望在阅读本文《动态筛选上传文件,跳过已删除项方法详解》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新文章相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

HTML 文件输入框的 `files` 属性是只读的 FileList 对象,无法直接修改或删除其中某一项;正确做法是维护一个独立的文件引用数组,在上传时按需过滤,而非尝试篡改原生 input.files。
在实现多文件上传并支持“删除预览文件”功能时,一个常见误区是试图直接操作 <input type="file"> 元素的 files 属性(例如用 splice() 或 delete),但这是无效的——因为 input.files 是只读的类数组对象(FileList),任何对其的修改都不会反映到实际数据上,也不会触发 DOM 更新。
✅ 正确思路:脱离原生 files,转而维护一个可变的 JavaScript 数组(如 selectedFiles = []),并在用户选择文件后、删除操作时、上传前分别管理该数组。
✅ 推荐实现步骤
监听 change 事件,将 e.target.files 转为真实数组并存入变量
let selectedFiles = []; document.getElementById("fileInput").addEventListener("change", function(e) { if (e.target.files.length > 0) { selectedFiles = Array.from(e.target.files); // ✅ 可增删改的真实数组 displayFiles(); // 渲染预览列表(含删除按钮) } });实现 removeFile(index):从 selectedFiles 中删除,而非操作 input.files
function removeFile(index) { selectedFiles.splice(index, 1); // ✅ 安全删除 displayFiles(); // 重新渲染剩余文件 }displayFiles() 示例:生成带删除按钮的预览列表
function displayFiles() { const list = document.getElementById("fileList"); list.innerHTML = ""; selectedFiles.forEach((file, i) => { const li = document.createElement("li"); li.innerHTML = ` ${file.name} (${(file.size / 1024).toFixed(1)} KB) <button type="button" onclick="removeFile(${i})">✕</button> `; list.appendChild(li); }); }上传时:仅遍历 selectedFiles 数组构造 FormData
function uploadFiles() { const formData = new FormData(); selectedFiles.forEach(file => { formData.append("files[]", file); // ✅ 使用当前有效文件 }); fetch("/upload", { method: "POST", body: formData }) .then(res => res.json()) .then(console.log) .catch(console.error); }
⚠️ 注意事项
- ❌ 不要尝试 input.files.splice()、delete input.files[i] 或赋值 input.files = newArray —— 浏览器会静默忽略;
- ✅ FileList 只能读取,所有“删除”逻辑必须基于你自己的数组副本;
- 若需保留原始选择顺序或支持取消再选,可额外记录 input 的 value 或使用 DataTransfer 模拟(进阶场景);
- 在生产环境建议增加文件类型/大小校验、防重复提交、上传进度反馈等健壮性处理。
通过这种「解耦式管理」,你既能自由控制待上传文件集合,又能保持 UI 与数据状态严格同步,是现代多文件交互的标准实践。
今天关于《动态筛选文件,跳过已删除项方法分享》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
122 收藏
-
494 收藏
-
186 收藏
-
212 收藏
-
417 收藏
-
146 收藏
-
135 收藏
-
120 收藏
-
395 收藏
-
178 收藏
-
253 收藏
-
366 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习