2016-03-27 127 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

通过设定实​​际的内容类型“应用/八位字节流”和避免预处理/皈依。