2016-03-27 5 views
0

私はサーバーに送るBASE64エンコードされたイメージのサイズを減らす方法を見つけようとしています。私はLZMAが提案された解決策であるところでquestionを見つけました。しかし、サーバー上のリクエストサイズを調べると、圧縮されていないバージョンのサイズは〜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

問題を引き起こしている2つの問題があります。 1.上記の質問に対する受け入れられた答えを読むと、LZMA JSライブラリが符号付きバイト配列を作成しており、サーバが符号なしのものを使用していることがわかります。 2. base64でエンコードする前のイメージの形式は、イメージの形式が多く圧縮されているため、base64でエンコードしてから結果の文字列を圧縮するとほぼ確実にデータのサイズが大きくなります。 – Harry

答えて

1

これは、フォーマットconvertionによるものです。 BASE64エンコーディングを送信すると、それはすでに文字列であり、そのままサーバーに送信されます。 代わりに、配列は実際の要求の前に文字列に変換されます。 データをあまりにも圧縮できない場合、圧縮されたものは同様のサイズになりますが、文字列変換操作では、各数値が10/12文字で平均して長くなるため、変換操作が増えます。

jqueryを使用している場合は、これがデータを投稿する正しい方法だと思います。実際のコンテンツタイプ「アプリケーション/オクテットストリーム」を設定し、前処理/ convertionを回避することによって

Sending binary data in javascript over HTTP

関連する問題