Vue3优雅实现选择文件与文件夹上传功能
利用Vue3隐藏原生input并用自定义按钮触发click实现文件上传与文件夹选择。通过webkitdirectory属性获取文件夹内文件的相对路径,便于后端重建目录。需手动清空input的value解决change事件不重复触发问题,并过滤文件扩展名以应对accept失效。文件夹上传在移动端不兼容,建议桌面端使用。
前言:原生文件上传按钮带来的困扰
许多前端工程师都曾面临这样的场景——产品经理递来一份设计稿,上面是一个精致到发光的按钮:圆角、渐变、悬停动画,样样齐全。你信心满满地打开浏览器,看到那个灰头土脸的 ……心里忍不住嘀咕:这玩意儿到底怎样才能变好看?

别担心,这个问题有办法解决!
今天就以 Vue 3 为例来攻克这个老大难问题。而且不只是选择单个文件,连一键选取文件夹这种操作也能轻松实现——没错,就是那种在网盘里常见的“上传整个文件夹”功能,前端自己就能完成。
核心思路:偷梁换柱法
说白了就一招:把原生 input 隐藏起来,用自定义按钮去“骗”它执行操作。
就好比家里装了声控灯,你一拍手它就亮,但背后其实藏着个物理开关。我们就是那个拍手的人,而 .click() 就是我们的掌声。
复制代码
<button @click="triggerUpload('file')"> 选择 PPT/PDF 文件button>
<button @click="triggerUpload('folder')"> 选择文件夹button>
<input ref="fileInputRef" type="file" accept=".ppt,.pptx,.pdf" style="display: none" />
<input ref="folderInputRef" type="file" webkitdirectory style="display: none" />
复制代码const triggerUpload = (type) => {
if (type === 'file') fileInputRef.value.click(); // 看,这不就点上了嘛!
else if (type === 'folder') folderInputRef.value.click();
};
黑科技:webkitdirectory 是什么神仙属性?
这是本次的重点!加上这个属性后,用户选中的不再是单个文件,而是整个文件夹。
它的返回值非常神奇——event.target.files 会把文件夹里所有子孙文件都平铺成一个数组,不管你目录嵌套了多少层。
划重点:每个文件对象上都有一个 webkitRelativePath 属性,它能告诉你这个文件在本地文件夹里的完整相对路径。
举个例子:你选了 我的项目 文件夹,里面有 图片/logo.png,那么 webkitRelativePath 就是 我的项目/图片/logo.png。
后端拿到这个路径,就能在服务器上原封不动地重建目录结构——是不是很酷?
血泪教训:解决 @change 不触发的千古难题
有没有遇到过这种尴尬:
- 第一次选了
报告.pptx,正常触发上传; - 上传失败了,或者你取消后想重新选一次;
- 再次点击同一个
报告.pptx; - @change 居然不执行了!
原因很简单:浏览器的“鸡贼”逻辑——它发现 input 的 value 没变化(还是同一个文件路径),就认为你没选新文件,所以不触发 change 事件。
解决办法:每次处理完文件后,手动清空 value!
复制代码const onFileSelected = (event) => {
const files = Array.from(event.target.files);
// ... 处理文件逻辑 ...
//
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Leaflet地图制作教程快速创建简单地图页面
Leaflet是一个轻量高效的JavaScript地图库,适合构建网页地理信息应用。它易于上手,支持移动设备,拥有丰富插件。使用需引入库文件并创建地图容器,可添加第三方瓦片底图与标记点,实现交互控件与事件响应。通过插件和矢量图形可扩展功能,优化大量数据展示并确保响应式设计。
Leaflet与OpenLayers地图库功能对比与选择指南
Leaflet与OpenLayers是两大主流开源地图库。Leaflet轻量简洁,适合快速构建移动端地图应用,依赖插件扩展功能。OpenLayers功能全面强大,支持复杂GIS标准和数据处理,适合专业地理信息系统。两者在API设计、性能侧重和适用场景上各有特点,选择需依据项目需求与技术背景。
Leaflet地图API入门指南快速上手教程
Leaflet是一款轻量、灵活的JavaScript地图库,适合构建移动端交互式地图。它提供地图加载、标记点、弹窗、矢量图形绘制与事件处理等核心功能,可快速创建基础地图并添加各类要素。其丰富的插件生态和框架集成方案还支持热力图、图层控制等进阶功能,易于上手且扩展性强。
React Native开发实战指南 常见用法与最佳实践详解
ReactNative允许使用JavaScript和React开发iOS与Android应用,提升跨平台开发效率。项目从环境搭建开始,使用核心组件构建界面,并通过API实现设备交互。导航依赖ReactNavigation库,状态管理可使用内置钩子或Redux等。需访问原生功能时,可通过桥接机制调用原生模块。开发中需关注调试、性能优化,并最终为各平台打包发布。
History pushState 实现网页导航的简单示例教程
HistoryAPI的pushState方法允许JavaScript直接更新浏览器URL和历史记录,而无需刷新页面,是实现单页面应用前端路由的核心技术。通过阻止链接默认跳转、调用pushState更新URL并加载内容,再结合popstate事件处理浏览器前进后退,可构建完整的导航体验。实际应用中需注意服务器配置与状态对象管理,其原理是许多前端路由库的基础。
- 热门数据榜
相关攻略
2026-07-16 06:34
2026-07-16 06:34
2026-07-16 06:34
2026-07-16 06:34
2026-07-16 06:33
2026-07-16 06:33
2026-07-16 06:33
2026-07-16 06:33
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

