我需要读取用户提供的一些csv文件。通过拖放div将文件传递给页面/脚本,处理文件拖放的方式如下:
function handleFileDrop(evt) {
evt.stopPropagation();
evt.preventDefault();
var files = evt.dataTransfer.files; // FileList object.
...
}
我需要使用一个csv库来解析每个文件并将其转换为数组,但我还需要跟踪我当前解析的文件名。以下是我用来解析每个文件的代码:
for(var x = 0; x < files.length; x++){
var currFile = files[x];
var fileName = currFile.name;
var reader = new FileReader();
reader.onload = (function(theFile){
return function(e){
var csvArr = CSV.csvToArray( e.target.result, ";", true );
console.log(csvArr);
};
})(currFile);
reader.readAsText(currFile);
}
到目前为止,一切都很顺利。我需要将文件名传递给reader.onload
事件,例如:
reader.onload = (function(theFile){
return function(e){
***** I need to have fileName value HERE *****
};
})(currFile);
这是可能的吗?我该如何做到这一点?非常感谢您提前的帮助,此致敬礼。
onload
属性的内容,实际上我们正在执行一个函数并传递currFile
。在该函数内部,theFile
只是我们传入的文件的另一个名称。这使我们能够存储对该文件名称的引用,一旦实际读取文件内容就可以访问它。 - GrahamfileName
变量的引用。你看到的语法通常被称为立即调用函数表达式,简称 IIFE。 - Grahamonload
就可以访问原始文件数组,因此可以访问名称。请参见https://codepen.io/anon/pen/jdXJRY?editors=1011作为基本示例。如果文件很大,则可以考虑为每个文件使用FileReader并在Workers内部读取它们以避免锁定浏览器。 - Graham