我试图允许用户将包含javascript文件的文件夹拖放到html 5页面中。这就是我目前所拥有的:
$scope.files = [];
//Establish dropzone
var dropbox;
dropbox = document.getElementById("fileDragAndDrop");
dropbox.addEventListener("dragenter", dragenter, false);
dropbox.addEventListener("dragover", dragover, false);
dropbox.addEventListener("drop", drop, false);
//Events
function dragenter(e) {
e.stopPropagation();
e.preventDefault();
};
function dragover(e) {
e.stopPropagation();
e.preventDefault();
};
function drop(e) {
e.stopPropagation();
e.preventDefault();
var items = e.dataTransfer.items;
for (var i = 0, item; item = items[i]; i ++) {
var entry = item.webkitGetAsEntry();
if(entry) {
traverseFileTree(entry);
}
}
};
//resursive file walker
function traverseFileTree(item) {
if(item.isFile) {
$scope.$apply(function () {
$scope.files.push(item);
});
} else if (item.isDirectory) {
var dirReader = item.createReader();
dirReader.readEntries(function(entries) {
for (var i = 0; i < entries.length; i++) {
traverseFileTree(entries[i]);
}
});
}
};
所以拖放工作,但我在阅读文件内容时遇到了问题。
$scope.parse = function () {
for(var i = 0; i < $scope.files.length; i++) {
var fileReader = new FileReader();
fileReader.onload = function (e) {
console.log(fileReader.result);
};
fileReader.onerror = function(err) {
console.log(err);
};
fileReader.readAsBinaryString($scope.files[i]);
}
};
我没有收到任何错误消息,这使得调试变得困难。难道我做错了什么?有没有人有任何问题做类似的任务?
答案 0 :(得分:6)
不确定你的$scope
是什么,但是要试一试。
当您使用webkitGetAsEntry()
时,我认为这适用于Chrome。从它的外观来看,你的代码应该给你一个错误。如果没有,可能会遗漏一些东西。你通常应该得到类似的东西:
未捕获的TypeError:无法执行&#39; readAsBinaryString&#39; on&#39; FileReader&#39;:参数不是Blob。
在$scope.parse
函数中。
有一些问题。一个是你可能会读files as text而不是二进制字符串。其次{@ 1}}已弃用,如果要读取二进制数据,请使用readAsBinaryString()
。
此外,readAsArrayBuffer()
会返回webkitGetAsEntry()
,因此您应该收到上述错误。要阅读您通常可以执行的文件:
FileEntry
例如:
$scope.files[i].file(success_call_back, [error_call_back]);
这将为function my_parser(file) {
var fileReader = new FileReader();
fileReader.onload = function (e) {
console.log(fileReader.result);
};
fileReader.onerror = function(err) {
console.log(err);
};
console.log('Read', file);
// Here you could (should) switch to another read operation
// such as text or binary array
fileReader.readAsBinaryString(file);
}
$scope.files[0].file(my_parser);
提供一个File
对象作为参数。然后你通常可以检查my_parser()
并使用适当的读取功能。 (虽然要注意MIME类型的松弛。如:不要依赖它,而是用它作为提示。)
.type
答案 1 :(得分:2)
$scope.parse = function () {
for(var i = 0; i < $scope.files.length; i++) {
var fileReader = new FileReader();
fileReader.onload = function (e) {
console.log(fileReader.result);
};
fileReader.onerror = function(err) {
console.log(err);
};
fileReader.readAsText($scope.files[i]);
}
};
答案 2 :(得分:0)
下面正在研究我的,这是打字稿
在传递给FileReader之前,应将FileEntry转换为标准文件。
select max(diff)
from (select dt - lag(dt) over(order by dt) diff from mytable) t