实现文件选择 通过 HTML 的 input 元素配合 webkitdirectory 属性(非标准但主流浏览器支持)实现目录选择: &…">
当前位置:首页 > JavaScript

js实现文件目录选择

2026-01-30 12:01:23JavaScript

使用 <input type="file"> 实现文件选择

通过 HTML 的 input 元素配合 webkitdirectory 属性(非标准但主流浏览器支持)实现目录选择:

<input type="file" id="dirPicker" webkitdirectory directory multiple />
<script>
  document.getElementById('dirPicker').addEventListener('change', (event) => {
    const files = event.target.files;
    console.log(files); // 文件列表(包含目录结构信息)
  });
</script>

注意

  • webkitdirectorydirectory 属性需同时声明以兼容不同浏览器。
  • multiple 允许选择多个文件(实际会包含目录下所有文件)。

使用 File System Access API(现代浏览器)

Chrome 86+ 和 Edge 支持更强大的文件系统访问 API,允许直接获取目录句柄:

js实现文件目录选择

async function pickDirectory() {
  try {
    const dirHandle = await window.showDirectoryPicker();
    const files = [];
    for await (const entry of dirHandle.values()) {
      files.push(entry);
    }
    console.log(files); // 包含文件/子目录的 FileSystemHandle 对象
  } catch (err) {
    console.error("用户取消选择或API不支持:", err);
  }
}

特性

  • 返回 FileSystemDirectoryHandle 对象,可递归遍历目录。
  • 需在安全上下文(HTTPS 或 localhost)中运行。

兼容性处理方案

若需兼容旧版浏览器,可降级到普通文件选择:

js实现文件目录选择

const isDirSupported = 'webkitdirectory' in HTMLInputElement.prototype;
const input = document.createElement('input');
input.type = 'file';
if (isDirSupported) {
  input.webkitdirectory = true;
} else {
  console.warn("浏览器不支持目录选择");
}

后端配合处理

选择目录后,通常需通过 FormData 上传文件列表:

const formData = new FormData();
Array.from(files).forEach(file => {
  formData.append('uploads[]', file, file.webkitRelativePath);
});
fetch('/upload', { method: 'POST', body: formData });

关键点

  • file.webkitRelativePath 包含文件在目录中的相对路径(如 folder/sub/file.txt)。

安全限制

  • 浏览器无法直接获取目录的本地绝对路径。
  • 用户必须主动触发文件选择(如点击事件),禁止自动弹出选择框。

标签: 文件目录
分享给朋友:

相关文章

jquery文件

jquery文件

jQuery文件获取与使用 jQuery是一个快速、简洁的JavaScript库,简化了HTML文档遍历、事件处理、动画和Ajax交互。以下是获取和使用jQuery文件的方法。 下载jQuery文件…

vue文件底层实现

vue文件底层实现

Vue 文件的底层实现 Vue 单文件组件(SFC,即 .vue 文件)的底层实现依赖于 Vue 的编译工具链,主要包括 @vue/compiler-sfc 和构建工具(如 Vite 或 Webpac…

php 实现目录树

php 实现目录树

实现目录树的方法 在PHP中实现目录树功能,可以通过递归或迭代方式遍历文件系统。以下是两种常见的实现方法: 递归方法 递归是处理目录树的自然方式,适合层级不深的结构: function build…

vue实现递归目录

vue实现递归目录

实现递归目录的基本思路 在Vue中实现递归目录通常涉及使用递归组件,即组件在其模板中调用自身。这种方式适合展示树形结构数据,如文件目录、菜单等。 递归组件实现步骤 创建递归组件需要定义一个有名称的组…

vue实现目录列表

vue实现目录列表

实现目录列表的基本思路 在Vue中实现目录列表通常涉及动态渲染嵌套结构的数据,结合递归组件或v-for循环处理层级关系。以下是两种常见实现方式: 方法一:使用递归组件 递归组件适合处理未知深度的嵌套…

vue实现树形目录

vue实现树形目录

Vue 实现树形目录的方法 递归组件实现 递归组件是Vue中实现树形结构的常见方法,通过组件调用自身实现无限层级嵌套。 <template> <ul> <l…