我试图允许用户将包含
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]);
- }
- };
我没有收到任何错误消息,这使得调试很困难.难道我做错了什么?有没有人有任何问题做类似的任务?
解决方法
不确定你的$scope是什么,但是试一试.
当您使用webkitGetAsEntry()时,我认为这适用于Chrome.从它的外观来看,你的代码应该给你一个错误.如果没有,可能会遗漏一些东西.你通常应该得到类似的东西:
Uncaught TypeError: Failed to execute ‘readAsBinaryString’ on ‘FileReader’: The argument is not a Blob.
在你的$scope.parse函数中.
有一些问题.一个是你可能会读取files as text而不是二进制字符串.其次,不推荐使用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()的参数.然后你通常可以检查.type并使用适当的读取功能. (虽然要注意MIME类型的松弛.如:不要依赖它,而是用它作为提示.)
- if (file.type.match(/application\/javascript|text\/.*/)) {
- // Use text read
- } else if (file.type.match(/^image\/.*/)) {
- // Use binary read,read as dataURL etc.
- } else ...