2016-06-14 9 views
0

現在、新しいHTML5ドリブンアップロードサイトを実装しようとしています。セキュリティ上の理由から、私はアップロードするファイルの種類に関しては通常非常に制限されていたので、通常はZIPファイルのみがバックエンドから受け入れられました。 ZIPを使用して困難を持っているように見えるの周りの多くの人々があるように思われるように、私は私はそれを試してみると次のように何かをしようと思いました: Javascript Filereader - ファイルタイプのチェック

  • の読む4最初のバイトをアップロードする

    • ファイルを選択します各ファイルは、それがZIPファイルかどうかを判断します(それは馬鹿な証拠ではありませんが、気にしないでください)。
    • ZIPファイルを直接アップロードする
    • 他のすべてのファイルを取り出し、その場でZIPアーカイブを作成し、新しく作成したアーカイブをアップロードします。

    は全体のことは、ファイルの種類のチェックを除いて、うまく機能:私は「スライス」を使用してい

    //'files' is an array of files retrieved from <input type='file'...for instance 
        function checkFileType(files, callback) { 
         for (var i = 0; i < files.length; i++) { 
    
          var fileReader = new FileReader(); 
    
          fileReader.onloadend = function (e) { 
           var arr = (new Uint8Array(e.target.result)).subarray(0, 4); 
           var header = ""; 
           for (var j = 0; j < arr.length; j++) { 
            header += arr[j].toString(16); 
           } 
    
           if (header == '504b34') 
            ; 
           else 
            callback("something"); 
    
          }; 
    
    
          var blob = files[i].slice(0, 4); 
          fileReader.readAsArrayBuffer(blob); 
         } 
        } 
    

    、ファイルが巨大な場合にのみ(4つの最初のバイトを読むためにここにIメモリを台無しにしたくない)。私に悩む唯一のこと:スライスのため、配列内の実際のファイルへの参照が失われます。私は配列からZIPとして検出されているファイルを削除し、それらを即座にアップロードし始める必要があります。

    その後、配列内の残りのファイルはすべて圧縮されます。私のアプローチは、...そのせいで行方不明「参照」の

  • 答えて

    0
    私はちょうどクロージャを使用して、簡単な解決策を見つけたと思い

    、...このよう

    function checkFileType(files, callback) 
    { 
        for(var i = 0; i < files.length; i++) { 
         var blob = files[i].slice(0, 4); 
         var fileReader = new FileReader(); 
    
         fileReader.onload = (function(file_array, i) 
         { 
          return function(e) { 
           var arr = (new Uint8Array(e.target.result)).subarray(0, 4); 
           var header = ""; 
    
           for (var j = 0; j < arr.length; j++) { 
            header += arr[j].toString(16); 
           } 
    
           if (header == '504b34') 
            callback("ZIP"); 
           else 
            callback(e.name); 
          }; 
         })(files, i); 
    
         fileReader.readAsArrayBuffer(blob); 
         console.log(fileReader.result); 
        } 
    } 
    

    、両方動作するようには思えません配列とインデックスへの参照は 'onload'コールバックの中で利用できます。

    関連する問題