2015-09-28 61 views
0

我對javascript/web編程極其新穎。我的上傳表單主要用於csv文件。我已經在使用pako來gzip我的json(在請求url中)。gzip表單輸入文件

如何在將文件發送到服務器之前對它們進行gzip壓縮?

這大約是我如何構建FORMDATA

$.each($("input[type=file]"), function(i, obj) { 
    $.each(obj.files, function(j, file) { 
     formData.append(obj.name, file); // we need to gzip the data 
    }) 
}); 

EDIT1:我已經成功(我認爲)gzip壓縮使用PAKO文件,但有1個問題 - 異步問題。這是我的新代碼:

$.each($("input[type=file]"), function(i, obj) { 
    $.each(obj.files, function(j, file) { 
     formData.append(obj.name, file); // we need to gzip the data 
     var r = new FileReader(); 
     r.onload = function(){ 
      var zippedResult = pako.gzip(r.result); 
      var oMyBlob = new Blob(zippedResult, {type : file.type}); // the blob 
      formData.append(obj.name, oMyBlob); // we need to gzip the data 
     }; 
     r.readAsArrayBuffer(file); 
    }) 
}); 
// Time to send the formData! 
$.ajax({...... 

正如你所看到的問題發生,因爲AJAX已經執行後的onload功能只跑了,所以FORMDATA是空白

EDIT2:我試圖創建一個onchange事件的輸入文件,所以這是我到目前爲止所提出的。雖然有一個問題 - 它似乎不是正確的壓縮。數據類型問題?

$("input[type=file]").change(function (event){ 
    var fileList = this.files; 
    $.each(fileList,function(i,file){ 
     var r = new FileReader(); 
     r.onload = function(){     
      var zippedResult = pako.gzip(r.result); 
      var oMyBlob = new Blob(zippedResult, {type : file.type}); 
      app.formData.append(event.target.name, oMyBlob, file.name); 
     }; 
     r.readAsArrayBuffer(file); 
    }); 
}); 

回答

0

設有一個圖書館JSZip,你可以在你的情況下可能使用。

+0

是否有任何理由爲什麼我應該使用JSZip而不是pako https://github.com/nodeca/pako? – CyberMew

+0

@Cyber​​Mew其實他們是一樣的,jszip更高級別,用pako作爲依賴。 – dimakura

+0

不,你不能JSZip [不支持](https://github.com/Stuk/jszip/issues/209)Gzip。 –

0

這就是我所做的 - 注意formData是一個全局變量。提交時請注意清除formData,否則它會繼續增加。另外,如果你重新選擇一個文件,它會被附加到表單上(這可能不是你想要的) - 我還沒有找到解決方法。

$("input[type=file]").change(function (event){ 
    var fileList = this.files; 
    $.each(fileList,function(i,file){ 
     var r = new FileReader(); 
     r.onload = function(){ 
      var convertedData = new Uint8Array(r.result); 

      // Zipping Uint8Array to Uint8Array 
      var zippedResult = pako.gzip(convertedData, {to : "Uint8Array"}); 

      // Need to convert back Uint8Array to ArrayBuffer for blob 
      var convertedZipped = zippedResult.buffer; 

      var arrayBlob = new Array(1); 
      arrayBlob[0] = convertedZipped; 

      // Creating a blob file with array of ArrayBuffer 
      var oMyBlob = new Blob(arrayBlob , {type : file.type}); // the blob (we need to set file.type if not it defaults to application/octet-stream since it's a gzip, up to you) 
      app.formData.append(event.target.name, oMyBlob, file.name); // we need to gzip the data 
     }; 
     r.readAsArrayBuffer(file); 
    }); 
});