游乐游手机版
首页/前端开发/文章详情

Vue3优雅实现选择文件与文件夹上传功能

时间:2026-07-16 06:30
利用Vue3隐藏原生input并用自定义按钮触发click实现文件上传与文件夹选择。通过webkitdirectory属性获取文件夹内文件的相对路径,便于后端重建目录。需手动清空input的value解决change事件不重复触发问题,并过滤文件扩展名以应对accept失效。文件夹上传在移动端不兼容,建议桌面端使用。

前言:原生文件上传按钮带来的困扰

许多前端工程师都曾面临这样的场景——产品经理递来一份设计稿,上面是一个精致到发光的按钮:圆角、渐变、悬停动画,样样齐全。你信心满满地打开浏览器,看到那个灰头土脸的 ……心里忍不住嘀咕:这玩意儿到底怎样才能变好看?

文件上传也能玩出花?Vue3 教你优雅实现“选择文件”和“选择文件夹”

别担心,这个问题有办法解决!

今天就以 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 不触发的千古难题

有没有遇到过这种尴尬:

  1. 第一次选了 报告.pptx,正常触发上传;
  2. 上传失败了,或者你取消后想重新选一次;
  3. 再次点击同一个 报告.pptx
  4. @change 居然不执行了!

原因很简单:浏览器的“鸡贼”逻辑——它发现 inputvalue 没变化(还是同一个文件路径),就认为你没选新文件,所以不触发 change 事件。

解决办法:每次处理完文件后,手动清空 value

 复制代码const onFileSelected = (event) => {
  const files = Array.from(event.target.files);
  // ... 处理文件逻辑 ...
  
  // 
来源:https://juejin.cn/post/7657439353724895241
上一篇构建Canvas交互式应用开发规范的最佳实践指南 下一篇HTML页面快捷跳转链接的设计与可访问性落地
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Leaflet地图制作教程快速创建简单地图页面
前端开发 · 2026-07-16

Leaflet地图制作教程快速创建简单地图页面

Leaflet是一个轻量高效的JavaScript地图库,适合构建网页地理信息应用。它易于上手,支持移动设备,拥有丰富插件。使用需引入库文件并创建地图容器,可添加第三方瓦片底图与标记点,实现交互控件与事件响应。通过插件和矢量图形可扩展功能,优化大量数据展示并确保响应式设计。

Leaflet与OpenLayers地图库功能对比与选择指南
前端开发 · 2026-07-16

Leaflet与OpenLayers地图库功能对比与选择指南

Leaflet与OpenLayers是两大主流开源地图库。Leaflet轻量简洁,适合快速构建移动端地图应用,依赖插件扩展功能。OpenLayers功能全面强大,支持复杂GIS标准和数据处理,适合专业地理信息系统。两者在API设计、性能侧重和适用场景上各有特点,选择需依据项目需求与技术背景。

Leaflet地图API入门指南快速上手教程
前端开发 · 2026-07-16

Leaflet地图API入门指南快速上手教程

Leaflet是一款轻量、灵活的JavaScript地图库,适合构建移动端交互式地图。它提供地图加载、标记点、弹窗、矢量图形绘制与事件处理等核心功能,可快速创建基础地图并添加各类要素。其丰富的插件生态和框架集成方案还支持热力图、图层控制等进阶功能,易于上手且扩展性强。

React Native开发实战指南 常见用法与最佳实践详解
前端开发 · 2026-07-16

React Native开发实战指南 常见用法与最佳实践详解

ReactNative允许使用JavaScript和React开发iOS与Android应用,提升跨平台开发效率。项目从环境搭建开始,使用核心组件构建界面,并通过API实现设备交互。导航依赖ReactNavigation库,状态管理可使用内置钩子或Redux等。需访问原生功能时,可通过桥接机制调用原生模块。开发中需关注调试、性能优化,并最终为各平台打包发布。

History pushState 实现网页导航的简单示例教程
前端开发 · 2026-07-16

History pushState 实现网页导航的简单示例教程

HistoryAPI的pushState方法允许JavaScript直接更新浏览器URL和历史记录,而无需刷新页面,是实现单页面应用前端路由的核心技术。通过阻止链接默认跳转、调用pushState更新URL并加载内容,再结合popstate事件处理浏览器前进后退,可构建完整的导航体验。实际应用中需注意服务器配置与状态对象管理,其原理是许多前端路由库的基础。