2016-03-27 12 views
0

Ich versuche eine Möglichkeit zu finden, die Größe von BASE64-kodierten Bildern zu reduzieren, die ich an den Server sende. Ich fand, dass question, wo LZMA Lösung vorgeschlagen wird. Wenn ich jedoch die Größe der Anfrage auf dem Server überprüfe, sehe ich, dass die Größe der unkomprimierten Version ~ 10 mal kleiner ist. Vermisse ich einen Schritt? Ich sehe, dass das Ergebnis der Komprimierung ist ein Byte Array Ich habe versucht, .toString('utf8') Methode zu verwenden, aber es scheint, dass es nur das Array beitreten.Warum die Größe einer durch LZMA-JS komprimierten Zeichenkette ist ca. 10x größer als vor der Komprimierung

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

Und auf dem Server:

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

Es gibt zwei Probleme, die das Problem verursachen können. 1. Wenn Sie die akzeptierte Antwort auf die Frage lesen, die Sie erwähnten, können Sie sehen, dass die LZMA JS-Bibliothek ein signiertes Byte-Array erstellt und der Server einen nicht signierten verwendet. 2. Welches Format haben die Bilder, bevor Sie sie mit base64 kodieren? Viele Bildformate sind bereits komprimiert, so dass die base64-Kodierung und anschließende Komprimierung der resultierenden Zeichenfolge die Größe der Daten erhöhen wird. – Harry

Antwort

1

Dies ist auf Format convertion fällig. Wenn Sie die BASE64-Codierung senden, handelt es sich bereits um eine Zeichenfolge, die unverändert an den Server gesendet wird. Ein Array wird stattdessen vor der eigentlichen Anfrage in eine Zeichenfolge konvertiert. Wenn Ihre Daten nicht zu stark komprimiert werden können, wird die komprimierte Datei eine ähnliche Größe haben, aber die Zeichenfolgenkonvertierungsoperation wird sie erhöhen, da jede Zahl im Durchschnitt 10/12 Zeichen lang ist.

Wenn Sie jQuery verwenden, denke ich, dies ist der richtige Weg, um die Daten zu posten.

Sending binary data in javascript over HTTP

durch den tatsächlichen Inhaltstyp 'application/octet-stream' -Einstellung und die Vermeidung der Vorverarbeitung/convertion.