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不总是有效)这太棒了!谢谢你。我已经为此问题挣扎了一段时间