2016-03-27 60 views
0

我正試圖找到一種方法來減少我發送到服務器的BASE64編碼圖像的大小。我發現question其中LZMA是建議的解決方案。但是,當我檢查服務器上的請求大小時,我發現未壓縮版本的大小是〜10倍。我錯過了一步嗎?我看到壓縮的結果是Byte Array我試圖使用.toString('utf8')方法,但它似乎只是加入數組。爲什麼由LZMA-JS壓縮的字符串大小約爲。比壓縮前大10倍

/* LZMA COMPRESS/DECOMPRESS */ 
.factory('ooLZMA', ['CONFIG', function (CONFIG) { 
    return { 
    compress: function (string) { 
     return LZMA.compress(string, CONFIG.stringCompression); 
    }, 
    decompress: function() { 
     return LZMA.decompress(string); 
    } 
    } 
}]) 

和服務器上:

console.log('size', req.headers['content-length']/1048576, 'comp', req.body.compressed); 

//"compressed" 
size 0.1276998519897461 comp true 
//raw BASE64 
size 0.01657390594482422 comp false 
+0

有兩個問題可能導致該問題。 1.如果您閱讀了您提到的問題的接受答案,則可以看到LZMA JS庫正在創建帶符號的字節數組,並且服務器正在使用未簽名的字節數組。 2.在base64對它們進行編碼之前,圖像的格式是什麼,很多圖像格式已經被壓縮,所以base64對它們進行編碼,然後壓縮生成的字符串幾乎肯定會增加數據的大小。 – Harry

回答

1

這是由於格式皈依。 如果您發送BASE64編碼,則它已經是一個字符串,並將其原樣發送到服務器。 在實際請求之前,將數組轉換爲字符串。 如果你的數據不能被壓縮得太多,壓縮後的數據將會有相似的大小,但字符串轉換操作會增加它,因爲每個數字平均長度爲10/12個字符。

如果您使用的是jQuery,我認爲這是發佈數據的正確方法。

Sending binary data in javascript over HTTP

通過設定實​​際的內容類型「應用/八位字節流」和避免預處理/皈依。