2017-09-27 38 views
0
function _validMimeType(file) { 
     var validSignatures = ['ffd8ffe0', '89504e47', '424d3804', '49492a00', 
     '4d4d002a' , 'd0cf11e0', '504b0304', '74686973', '7b5c7274', '25504446', 
     '52617221']; 
     var slice = file.slice(0, 4); 
     var reader = new FileReader();  
     reader.onloadend = function(e) { 
      var view = new DataView(reader.result), 
      signature; 
      if(view.byteLength == 8){ 
       signature = view.getUint32(0, false).toString(16) + 
       view.getUint32(4, false).toString(16); 
      } else { 
       signature = view.getUint32(0, false).toString(16); 
      } 
      for (var i = 0; i < validSignatures.length; i++) { 
       if (signature == validSignatures[i].toLowerCase()) { 
        console.log(signature); 
        return true; 
       } 
      } 
      return false; 
     } 
     reader.readAsArrayBuffer(slice); 
    } 

_validMimeType(file) returns me undefined 

当我将文件从上传器传递给_validMimeType(文件)时,它会返回我未定义的文件。等待文件读取器返回true或false

+0

正确的,因为你不是在'_validMimeType'返回任何东西 - 并抢先下一个问题,读https://开头stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call –

+0

因为这不是ajax调用。我需要它在onloadend函数结束时返回true或false。我该怎么做 – Aatif

+0

你不能让'_validMimeType'同步返回一个值,因为它会异步确定返回值......你需要学习使用异步技术(回调,承诺等) - 你读过https ://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call? –

回答

0

简单的解决方案,因为的FileReader是异步的,就是用一个回调

function _validMimeType(file, callback) { // add callback argument 
    var validSignatures = ['ffd8ffe0', '89504e47', '424d3804', '49492a00', 
    '4d4d002a' , 'd0cf11e0', '504b0304', '74686973', '7b5c7274', '25504446', 
    '52617221']; 
    var slice = file.slice(0, 4); 
    var reader = new FileReader();  
    reader.onloadend = function(e) { 
     var view = new DataView(reader.result), 
     signature; 
     if(view.byteLength == 8){ 
      signature = view.getUint32(0, false).toString(16) + 
      view.getUint32(4, false).toString(16); 
     } else { 
      signature = view.getUint32(0, false).toString(16); 
     } 
     for (var i = 0; i < validSignatures.length; i++) { 
      if (signature == validSignatures[i].toLowerCase()) { 
       console.log(signature); 
       // change this 
       return callback(true); // return so no fallthrough occurs 
      } 
     } 
     // change this 
     callback(false); 
    } 
    reader.readAsArrayBuffer(slice); 
} 

_validMimeType(file, function(result) { 
    // result is true or false 
}