html5拖放文件,HTML5是否允许拖放拖放文件夹或文件夹树?
不幸的是,现有答案中没有一个是完全正确的,因为readEntries不一定会返回给定目录的所有(文件或目录)条目。这是API规范的一部分(请参见下面的文档部分)。
为了真正获取所有文件,我们需要readEntries重复调用(对于遇到的每个目录),直到它返回一个空数组。如果不这样做,我们将丢失目录中的某些文件/子目录(例如在Chrome中),readEntries一次最多只能返回100个条目。
使用Promises(await/ async)可以更清楚地演示readEntries(因为它是异步的)的正确用法,并使用广度优先搜索(BFS)遍历目录结构:
// Drop handler function to get all files
async function getAllFileEntries(dataTransferItemList) {
let fileEntries = [];
// Use BFS to traverse entire directory/file structure
let queue = [];
// Unfortunately dataTransferItemList is not iterable i.e. no forEach
for (let i = 0; i < dataTransferItemList.length; i++) {
queue.push(dataTransferItemList[i].webkitGetAsEntry());
}
while (queue.length > 0) {
let entry = queue.shift();
if (entry.isFile) {
fileEntries.push(entry);
} else if (entry.isDirectory) {
queue.push(...await readAllDirectoryEntries(entry.createReader()));
}
}
return fileEntries;
}
// Get all the entries (files or sub-directories) in a directory
// by calling readEntries until it returns empty array
async function readAllDirectoryEntries(directoryReader) {
let entries = [];
let readEntries = await readEntriesPromise(directoryReader);
while (readEntries.length > 0) {
entries.push(...readEntries);
readEntries = await readEntriesPromise(directoryReader);
}
return entries;
}
// Wrap readEntries in a promise to make working with readEntries easier
// readEntries will return only some of the entries in a directory
// e.g. Chrome returns at most 100 entries at a time
async function readEntriesPromise(directoryReader) {
try {
return await new Promise((resolve, reject) => {
directoryReader.readEntries(resolve, reject);
});
} catch (err) {
console.log(err);
}
}
Codepen上的完整工作示例:https ://codepen.io/anon/pen/gBJrOP
FWIW我之所以选择它,是因为在使用接受的答案时,我没有找回包含40,000个文件的目录(许多目录包含100多个文件/子目录)的所有文件。
说明文件:
FileSystemDirectoryReader中记录了此行为。重点摘录:
readEntries()
返回一个包含一些 目录条目的数组。数组中的每个项目都是基于FileSystemEntry的对象,通常是FileSystemFileEntry或FileSystemDirectoryEntry。
但公平地说,MDN文档可以在其他部分中使这一点更加清楚。该readEntries()文件只是指出:
readEntries()方法检索正在读取的目录中的目录条目,并将它们以数组形式传递给提供的回调函数
并且唯一需要多次调用的提示是在successCallback参数的描述中:
如果没有剩余文件,或者您已经在此FileSystemDirectoryReader上调用了readEntries(),则该数组为空。
可以说该API也可以更加直观,但是如文档所述:它是一项非标准/实验性功能,不在标准轨道上,并且不能指望所有浏览器都可以使用。
有关:
johnozbay评论说,在Chrome上,readEntries一个目录(验证为Chrome 64)最多返回100个条目。
XanreadEntries很好地解释了此答案的正确用法(尽管没有代码)。
PabloBarríaUrenda的答案可以readEntries在没有BFS的情况下以异步方式正确调用。他还指出,Firefox返回目录中的所有条目(与Chrome不同),但是给定规范,我们不能依靠它。
html5拖放文件,HTML5是否允许拖放拖放文件夹或文件夹树?相关推荐
- 【HTML5初探之form标签】解放表单验证、增加文件上传、集成拖放
导航 [初探HTML5之使用新标签布局]用html5布局我的博客页! [HTML5初探之form标签]解放表单验证.增加文件上传.集成拖放 [HTML5初探之绘制图像(上)]看我canvas元素引领下 ...
- html5 drag this,HTML5拖放(drag和drog)
拖放(drag和drog)是HTML5的标准的组成部分,也是种常见的特性,意义为抓起一个元素放入到另外的一个位置,在HTML5中任何元素都可以被拖放,前题是要相关进行设置. 1.设置元素为可拖放,也就 ...
- html video拖放设置,HTML5新特性以及video和audio标签和拖放笔记
新特性 用于绘画的canvas元素 用于媒介回访的video和audio元素 对本地离线存储更好的支持 新的特殊内容元素 article footer header nav section 新的表单控 ...
- 在线拖拽html,html5拖曳操作 HTML5实现网页元素的拖放操作
HTML5之前,要实现网页元素的拖放操作,需要依靠mousedown.mousemove.mouseup等API,通过大量的JS代码来实现:HTML5中引入了直接支持拖放操作的API,大大简化了网页元 ...
- html5拖动图像的关键字,6.7 拖放图像 - HTML5 Canvas 实战
本节实质上是结合前两节的概念,来演示如何拖放一副图像. 操作步骤 按照以下步骤,来拖放一副图像: 1.链接到Events类: 2. 定义writeMessage()函数,该函数输出一条消息: func ...
- html5批量修改本地文件名,文件名批量更名技巧;将文件夹名添加到文件名上-批量修改文件名...
对文件批量更名的需求背景: 外出游玩,拍了很多张旅游照片,但大多数相机对拍摄的照片的命名一般是:IMG_20180706102314.jpg等样式,这种命名是没有任何意义的,只是知道是拍摄的日期时间是 ...
- html扩展名用于保存清单文件,HTML5 manifest ApplicationCache
使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. HTML5引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问 ...
- html5 写json 文件,HTML5实现本地JSON文件的读写
参考: 使用HTML5来实现本地文件读取和写入 (FileReader读取json文件,FileSaver.js保存json文件) JS创建.写入.读取本地文件(txt) (ActiveXObj ...
- html5视频上传云,vue+七牛云上传视频文件
Qiniu-JavaScript-SDK基于七牛云存储官方 API 构建,其中上传功能基于 H5 File API.开发者基于 JS-SDK 可以方便的从浏览器端上传文件至七牛云存储,并对上传成功后的 ...
最新文章
- java书籍_这本最适合夯实基础的Java 书籍,80% 的 Java 程序员没认真看过
- 利物浦大学图书馆官网西交利物浦大学图书馆官网
- 你应该如何选择笔记软件?
- 7-5 图形继承与多态 (50 分)
- struts2 action中result参数详解
- nodejs express 学习
- Python网络框架——Web服务器
- uvalive3983Robtruck
- Win10 LSTC与Ubuntu18.04LTS双系统安装详细流程
- 深度相机之iPhone X选择的秘诀和方法
- 计算机英语 自我介绍,计算机专业学生面试英语自我介绍
- 蓝牙电话协议HFP(Hands-Free Profile) SCO建立/释放/在通话中Audio transfer
- OLTP与OLAP理解
- 利用Fuel-OpenStack9.0安装部署私有云平台OpenStack详细教程(上)
- ARP防御篇-如何揪出“内鬼”并“优雅的还手”
- mysql 映射到map null_mybatis处理查询map列表属性为null的问题,而导致查询map无该key对象...
- 软文推广高质量的新闻媒体网站都有哪些_软文管家
- JS获取日期(年/月/日/时/分/秒)格式转化
- 分享30个高品质的抽象网页背景素材
- 李永乐复习全书高等数学 第一章 函数、极限、连续
热门文章
- elasticsearch docker无法挂载_Docker 容器监控方案怎么选?看看这套开源方案
- Vue 2与Vue 3在自定义组件v-model上的区别
- 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来
- VS2012下基于Glut OpenGL GL_POLYGON_STIPPLE示例程序:
- Cocos2dx 之 ButtonSprite
- mysql数据库在哪里写语句_Mysql数据库操作语句
- Atitit.研发管理如何避免公司破产倒闭的业务魔咒
- using和名空间namespace
- CCF CSP 201604-1 折点计数
- Java基础-重要版本