跳至主要內容

js上传文件夹 H5

Hew.iShare大约 2 分钟知识点技术文件上传文件夹上传批量上传

前言:本文摘自我的个人cnblog博客(原文发表于2017年),并在原来的基础上进行修改,主要阐述通过一个属性即可开启浏览器中网页文件夹上传,更准确的说是input[type=file]的一个属性。本文只是做一个简单的知识点记录。

背景

当时公司所在项目,有一个文件上传小需求,要求上传文件要可以同时选择文件及文件夹,文件可以多选。如果选择文件夹即默认将文件夹内的文件全部上传。当时想到的唯一解决方案就是便利所选文件夹内的文件,然后进行上传,但始终觉得此方案不是太好,冥冥之中感觉应该是有现成的解决方案的。借助于搜索引擎,当时并未发现其他较好的解决方案,此时,我却记得某些网盘有此功能,遂研究百度网盘文件上传功能。

进入百度网盘网页版,发现百度网盘个人主页上还真有上传文件夹的按钮,点击此按钮弹出的资源管理器中(windowsOS),就可以直接选择文件夹。故推断此功能应该不是js实现的,于是就在html标签属性中下功夫,果不其然,就在百度网盘上传的input type=file 的标签上发现了一个未曾见过的属性“webkitdirectoryopen in new window”,进入MDN一查,果然就是这个属性开启了input的文件夹上传功能。但是,此属性还处在实验非标准 non-standard中,兼容性是最大的问题。2017年当时使用是实际测试仅支持chrome浏览器,而到目前为止,MDN给出的兼容性还算不错,支持chrome、edge、firefox较新版本浏览器。具体信息可以点这里查看:HTMLInputElement.webkitdirectoryopen in new window

示例

下面的示例将展示一个或多个选择文件夹,触发change事件后,将选择的文件的文件名显示在列表中进行展示。(摘自MDN)

HTML

<input type="file" id="filepicker" name="fileList" webkitdirectory multiple />
<ul id="listing"></ul>

Javascript

document.getElementById("filepicker").addEventListener("change", function(event) {
  let output = document.getElementById("listing");
  let files = event.target.files;

  for (let i=0; i<files.length; i++) {
    let item = document.createElement("li");
    item.innerHTML = files[i].name;
    output.appendChild(item);
  };
}, false);

结语

对于目前要实现上传文件夹功能,此属性可作为一个选择,但要追求兼容各浏览器,恐怕要曲线救国,采用其他方式和了。其实,我们都可以参考百度网盘网页版做法,对支持此属性的浏览器则显示上传文件夹选项,如果不支持此属性则不显示上传文件夹选项,从而做到一定的兼容。