Javascript 文件读取器和回调
我正在努力重新处理找到的想法/代码(基本前提是通过查看前几个字节的数据来确定文件类型) 我已经有了做我想做的事情的底子——看 这是我的密码:Javascript 文件读取器和回调,javascript,Javascript,我正在努力重新处理找到的想法/代码(基本前提是通过查看前几个字节的数据来确定文件类型) 我已经有了做我想做的事情的底子——看 这是我的密码: function readTheFiles(file){ var fileReader = new FileReader(); fileReader.onloadend = function(e) { var fileHeader = new Uint8Array(e.target.
function readTheFiles(file){
var fileReader = new FileReader();
fileReader.onloadend = function(e) {
var fileHeader = new Uint8Array(e.target.result).subarray(0, 4);
var header = "";
for (var q = 0; q < fileHeader.length; q++) {
header += fileHeader[q].toString(16);
}
alert(header);
return header;
};
fileReader.readAsArrayBuffer(file);
}
$("#input-id").on('change', function(event) {
var files = event.target.files;
var i = 0;
for (var i = 0, file; file = files[i]; i++) {
var headString = readTheFiles(file);
alert(headString);
}
});
函数读取文件(文件){
var fileReader=newfilereader();
fileReader.onloadend=函数(e){
var fileHeader=newuint8array(e.target.result).subarray(0,4);
var header=“”;
对于(var q=0;q
从我读到的(,)中,我确信问题在于调用readTheFiles函数中的回调-可能代码在加载文件之前调用了警报(headString)行(因此readTheFiles函数中的警报会给出预期的结果)
我渴望了解校长,而不是仅仅得到一个解决方案,因此我将非常感激您的指点/建议/帮助
非常感谢我正在回答你的问题,为什么你的
警报(头串)
呼叫告诉你“未定义”。可能有更好的方法来发现您正在处理的文件类型
您正在使用一个异步进程。我已经修改并注释了您的代码,以便您可以看到事情发生的顺序。您将看到,我创建了一个treat
函数,其作用域与您的on(“change”,…)
函数的作用域相同。然后,我将此函数作为参数传递给readTheFiles()
函数,以便稍后读入文件时可以调用它
function readTheFiles(file, callback, index){
var fileReader = new FileReader();
// 3. This function will be called when readAsArrayBuffer() has
// finished reading the file
fileReader.onloadend = function(e) {
var fileHeader = new Uint8Array(e.target.result).subarray(0, 4);
var header = "";
for (var q = 0; q < fileHeader.length; q++) {
header += fileHeader[q].toString(16);
}
callback(header, index);
};
// 2. This gets called almost as soon as fileReader has been created
fileReader.readAsArrayBuffer(file);
}
$("#input-id").on('change', function(event) {
var files = event.target.files;
var i = 0;
for (var i = 0, file; file = files[i]; i++) {
// 1. This is executed for each file that you selected, immediately
// after selection. The treat() function is sent as a callback.
// It will be called later, when the file has been read in.
// Passing `i` as an argument allows you to see which order the
// files are treated in.
var headString = readTheFiles(file, treat, i);
}
// 4. This is called by the callback(header) command inside the
// readTheFiles() function. The `treat` function was sent to
// readTheFiles as the `callback` argument. Putting brackets()
// after the function name executes it. Any value put inside
// the brackets is sent as an argument to this function.
function treat(header, index) {
alert("Header for file " + index + ":" + header);
}
});
函数读取文件(文件、回调、索引){
var fileReader=newfilereader();
//3.当readAsArrayBuffer()已启动时,将调用此函数
//已完成文件的读取
fileReader.onloadend=函数(e){
var fileHeader=newuint8array(e.target.result).subarray(0,4);
var header=“”;
对于(var q=0;q
文件。type
应该已经告诉您文件的类型,您的计算机上是否有错误?另外,我认为,readAsBinaryString
的结果会更容易比较。你不能这么做。Read@dandavis不,它没有,它只是告诉你文件的扩展名与什么类型有关(无论如何,在windows上,我已经在一个扩展名不重要的系统上尝试过了)。非常想关闭的副本不是作为dup提供的,而是如何识别文件(这也是为什么你应该使用超过前四个字节,以及为什么file.type不总是有效)这太棒了!谢谢你。我已经为此问题挣扎了一段时间