HTML 5文件阅读器读取javaScript文件

时间:2013-12-19 14:14:47

标签: javascript angularjs html5 filereader

我试图允许用户将包含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]);
    }
};

我没有收到任何错误消息,这使得调试变得困难。难道我做错了什么?有没有人有任何问题做类似的任务?

3 个答案:

答案 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