选择并删除要解析的文件和/或文件夹
Select & Drop Files and/or Folders to be parsed
我在SO上使用了一个帖子的一部分(虽然我不记得了)来解析Chrome上的文件和文件夹,但我无法让它在Firefox上工作(老实说,我没有在其他人身上尝试过,尽管我认为它也不适用于safari)。
这是 2 个指令,ngDrop 和输入。
angular.module('myApp').directive("ngDrop", function($rootScope) {
var link = function($scope, elements, attr, ngModel) {
var parseInput = function(event) {
var list = [];
$scope.count = 0;
var toParse = [];
for (var i = 0; i < event.dataTransfer.items.length; i++) {
toParse.push(event.dataTransfer.items[i].webkitGetAsEntry());
}
var traverse_directory = function(entry) {
var reader = entry.createReader();
// Resolved when the entire directory is traversed
return new Promise(function executer(resolve_directory) {
var iteration_attempts = [];
(function read_entries() {
// According to the FileSystem API spec, readEntries() must be called until
// it calls the callback with an empty array. Seriously??
reader.readEntries(function(entries) {
if (!entries.length) {
// Done iterating this particular directory
resolve_directory(Promise.all(iteration_attempts));
} else {
// Add a list of promises for each directory entry. If the entry is itself
// a directory, then that promise won't resolve until it is fully traversed.
iteration_attempts.push(Promise.all(entries.map(function(entry) {
if (entry.isFile) {
list.push(entry);
return entry;
} else {
return traverse_directory(entry);
}
})));
// Try calling readEntries() again for the same dir, according to spec
read_entries();
}
});
})();
});
};
var updateNgModel = function() {
var files = [], count = 0;
for (var i = 0; i < list.length; i++) {
list[i].file(function(file) {
files.push(file);
count++;
if (count === list.length) {
ngModel.$setViewValue(files);
}
});
}
};
for (var j = 0; j < toParse.length; j++) {
if (toParse[j].isFile) {
list.push(toParse[j]);
} else if (toParse[j].isDirectory) {
$scope.count++;
traverse_directory(toParse[j]).then(function() {
$scope.count--;
if ($scope.count == 0) {
updateNgModel();
}
});
}
}
if ($scope.count == 0) {
updateNgModel();
}
}
elements[0].ondrop = function(event) {
event.stopPropagation();
event.preventDefault();
// ... styling
parseInput(event);
};
elements[0].ondragover = function(event) {
event.preventDefault();
};
};
return {
restrict: 'A',
require:"^ngModel",
link: link
};
});
// select file on input
angular.module('myApp').directive("input", function($rootScope) {
var link = function($scope, elements, attr, ngModel) {
if (attr.type && attr.type.toLowerCase() === 'file') {
elements[0].onchange = function(event) {
var list = event.__files_ || (event.target && event.target.files);
var files = [];
for (var i = 0; i < list.length; i++) {
files.push(list[i]);
}
ngModel.$setViewValue(files);
};
}
};
return {
restrict: 'E',
require:"^ngModel",
link: link
};
});
关于实现,这就是我使用它们的方式:
<div class="dropzone" ng-model="files" ng-drop>
<input type="file" ng-model="files" webkitdirectory multiple>
<h2><i class="fa fa-upload"></i> Drop Images Here !</h2>
<div>Or just click to select files.</div>
</div>
这两个指令主要用于填充 ngModel。
这是一个 plunkr
现在当我在FF中拖放时:TypeError: event.dataTransfer.items is undefined
当我选择:TypeError: list is null
我可以更改什么才能使其同时在Chrome和Firefox上运行,为什么不同时在其他浏览器上运行?
我可以更改什么才能使其在Chrome和Firefox上运行
请注意,Firefox 目前不支持 directory
元素处的属性input type="file"
读取上传的文件夹; .webkitGetAsEntry()
不是火狐支持的方法。
尝试将<input type="file">
与 multiple
、webkitdirectory
属性集一起使用; <input type="radio">
用户选择文件夹或文件上传以在input type="file"
元素处切换webkitdirectory
属性。当webkitdirectory <input type="file" />
上存在时无法选择文件,允许chrome同时选择/要么选择目录或文件。
window.onload = function() {
var results = document.getElementById("results");
var dropped = document.getElementById("filesDropped");
var file = document.getElementById("file");
var files = document.getElementById("files");
var folder = document.getElementById("folder");
document.getElementById("type").onchange = function(e) {
file[(files.checked ? "remove" : "set")
+ "Attribute"]("webkitdirectory", true)
}
file.onchange = function(e) {
results.innerHTML = "";
e.preventDefault();
e.stopImmediatePropagation();
var files = e.target.files;
dropped.innerHTML = files.length;
for (var i = 0; i < files.length; i++) {
if (/image/.test(files[i].type)) {
(function(j) {
var img = new Image;
img.onload = function() {
console.log(files[j]);
var figure = document.createElement("figure");
var figcaption = document.createElement("figcaption");
figcaption.innerHTML = files[j].name;
figure.appendChild(figcaption);
figure.appendChild(img);
results.appendChild(figure);
URL.revokeObjectURL(url);
}
var url = URL.createObjectURL(files[j]);
img.src = url;
}(i))
} else {
console.log(files[i].type, files[i])
}
}
results.style.width = width;
}
}
#dropzone {
padding: 0px;
margin: 0px;
width: 400px;
height: 300px;
border: 2px dotted green;
}
#dropzone:hover {
border: 4px dotted blue;
}
#dropzone input {
width: 400px !important;
height: 300px !important;
opacity: 0;
}
#results {
position: relative;
display: block;
width: auto;
min-height: 50px;
}
#filesDropped:after {
content: " Files dropped:";
}
figure,
figcaption {
display: block;
position: relative;
width: 100%;
}
<span id="filesDropped"></span>
<div id="results"></div>
<br>
<span id="type">Drop files <input id="files" name="type" type="radio"> folder <input checked id="folder" name="type" type="radio">:</span>
<div id="dropzone">
<input id="file" type="file" multiple webkitdirectory/>
</div>
Nightly 45+ 支持目录上传。请参阅火狐浏览器是否支持文件夹上传?
window.onload = function() {
document.querySelector("input").onchange = function(e) {
var uploadFile = function(file, path) {
// handle file uploading
console.log(file, path)
};
var iterateFilesAndDirs = function(filesAndDirs, path) {
for (var i = 0; i < filesAndDirs.length; i++) {
if (typeof filesAndDirs[i].getFilesAndDirectories === "function") {
var path = filesAndDirs[i].path;
// this recursion enables deep traversal of directories
filesAndDirs[i].getFilesAndDirectories().then(function(subFilesAndDirs) {
// iterate through files and directories in sub-directory
iterateFilesAndDirs(subFilesAndDirs, path);
});
} else {
uploadFile(filesAndDirs[i], path);
}
}
};
if ("getFilesAndDirectories" in e.target) {
e.target.getFilesAndDirectories()
.then(function(filesAndDirs) {
iterateFilesAndDirs(filesAndDirs, "/");
})
} else {
// do webkit stuff
}
}
}
<input type="file" webkitdirectory allowdirs directory />
波兰兹罗提 http://plnkr.co/edit/DSUeZiW4JjvxmRrFnqN0?p=preview
- 将配置文件文件夹移动到sdcardfirefoxmobile14.0
- Grunt imagemin-观察多个文件/文件夹优化单个文件
- Angular 2-模型驱动的表单,带有输入文件(文件上传)
- 将整个JavaScript文件文件夹添加到HTML5应用程序缓存中
- HTML或JavaScript,如何找出程序文件文件夹的位置
- 使用 OS 在 JavaScript 中预置文件.文件
- 使用纯 JavaScript 创建文件/文件夹
- 基本脚本,它向自己发送一封包含从文件文件夹中随机选择的内容的邮件
- 巴贝尔节点不't编译时忽略指定的文件/文件夹
- 在以下场景中,如何使代码可用于多个文件文件对象
- Chrome拖放文件/文件夹不工作
- Bootstrap fileinput删除所有文件文件,而不是要删除的特定预览文件
- 如何在SonarQube 4.4's技术债务计算中忽略文件/文件夹?
- OneDrive for Business是否有客户端javascript库提供文件/文件夹选择器控件?
- 将文件从插件复制到配置文件文件夹
- 从sd卡复制目录到“文件”;文件夹中
- 逐行读取上传的文件.文件,使用cfs:gridfs存储)
- 配置grunt copy任务,排除文件/文件夹
- 用于检查CSS和JS文件文件夹的工具
- gruntjs:将文件+文件夹重命名为任务