Search code examples
javascriptfileuploadmimereader

Wait for file reader to return me a true or false


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

When i pass file from a uploader to _validMimeType(file) it returns me undefined.


Solution

  • Simplest solution, because FileReader is asynchronous, is to use a callback

    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
    }