Einen Blob in Javascript komprimieren

8

Ich muss einen Blob an den Server mit Ajax senden, aber es kann etwas groß werden, und ich möchte die Upload-Zeit verringern. Ich habe jszip bereits versucht, aber das gab mir nur eine leere Datei in der Zip. Ich habe auch versucht, btoa (), aber es stellt sich heraus, dass der kodierte Wert am Ende nur [Objekt Blob] anstelle der eigentlichen Blob-Daten. Welche Möglichkeiten habe ich, Blobs zu komprimieren?

Hier war der Code, den ich für jszip verwendet habe:

%Vor%

Ich habe dann "content" an ein FormData-Objekt angehängt und es an den Server gesendet. Auf der Serverseite dekodierte ich die POST-Daten (von base64). Die Zip-Datei wurde problemlos geöffnet, aber recording.wav war eine 0-Datei.

Zusätzlich habe ich versucht, die LZW-Implementierung hier zu verwenden. Dies war der zusätzliche Code, mit dem ich ihn komprimiert habe:

%Vor%

Die Dekomprimierung gibt jedoch null zurück.

    
Fibericon 16.06.2013, 05:11
quelle

2 Antworten

10

Vorbehalt: Komprimieren von Dingen wie Audiodateien wäre besser mit einem Algorithmus, der speziell für diese Art von Daten gedacht ist, vielleicht etwas verlustbehaftet. Da ich jedoch weiß, wie schwierig es ist, eine sinnvolle verlustfreie Implementierung wie unten beschrieben zu finden, bin ich sehr besorgt, dass es schwierig sein wird, eine gute Java-Implementierung für diese Art von Daten zu finden, die genau Ihren Anforderungen entspricht.

In jedem Fall hatte ich diese allgemeine Notwendigkeit für die Komprimierung / Dekomprimierung auch in Javascript, und ich brauchte den gleichen Algorithmus, um sowohl den Client (Browser) als auch den Server (node.js) zu verwenden, und ich brauchte ihn Arbeit an sehr großen Dateien. Ich hatte jszip ausgecheckt und ich habe auch diesen LZW-Algorithmus unter mindestens fünf oder sechs anderen ausprobiert, von denen keiner den Anforderungen entsprach. Ich kann mich nicht erinnern, was das Problem mit jedem speziell war, aber es genügt zu sagen, dass es überraschend schwer ist, einen guten und SCHNELLEN Kompressor / Dekompressor in Javascript zu finden, der sowohl auf der Server- als auch auf der Clientseite funktioniert und große Dateien verarbeitet! Ich habe mindestens ein Dutzend verschiedene Implementierungen verschiedener Komprimierungsalgorithmen ausprobiert und mich schließlich damit abgefunden - es hat mich noch nicht im Stich gelassen!

AKTUALISIEREN

Dies ist die ursprüngliche Quelle: Ссылка

Von jemandem namens Bär - danke Bär, wer auch immer du bist, du bist der Beste. Es ist LZJB: Ссылка

UPDATE 2

  1. Ein Problem mit fehlendem Semikolon wurde behoben - sollte dem Objekt kein Funktionsfehler mehr angezeigt werden.
  2. Diese Implementierung funktioniert nicht mehr mit Daten, die weniger als 80 Zeichen lang sind. Also habe ich das Beispiel aktualisiert, um das zu reflektieren.
  3. Realisiert, dass die base64 encode / decode-Methoden tatsächlich auf dem Objekt verfügbar sind, das für diese Version übergeben wurde, also ...
  4. Momentan sehen wir, was wir mit bestimmten Blob-Typen machen können - was zum Beispiel der beste Ansatz für ein Bild im Vergleich zu Audio usw. wäre, wie es für JS-Leute im Allgemeinen nützlich wäre ... wird hier mit dem was gefunden wird aktualisiert / li>

UPDATE 3

Es gibt eine viel bessere Hülle um die ursprüngliche Iuppiter-Quelle von Bear als die, die ich unten veröffentlicht habe. Es wird von cscott und von github hier geschrieben: Ссылка

Ich werde zu diesem wechseln, da es auch Streams gibt.

Im Folgenden finden Sie ein Beispiel in Node.js für die Verwendung mit einer WAV-Datei. Aber bevor Sie das Beispiel kopieren, lassen Sie mich zuerst die schrecklichen Nachrichten geben, zumindest für diese eine wav-Datei, die ich ausprobiert habe:

%Vor%

So hat es das wav erfolgreich regeneriert (und es hat gespielt). Der komprimierte scheint jedoch größer als das Original zu sein. Gut schießen. In jedem Fall, könnte es gut sein, Ihre Daten anzuprobieren, Sie wissen nie, Sie könnten Glück haben. Hier ist der Code, den ich verwendet habe:

%Vor%

Am Ende des Tages denke ich, dass es zu schwierig sein wird, bei den meisten Formen von Binärdaten irgendeine Komprimierungsstufe zu erreichen, die nicht durch die resultierende base64-Codierung verfälscht wird. Die Tage der Steuerzeichen für Terminals verfolgen uns noch heute. Sie könnten versuchen, auf eine andere Basis zu wechseln, aber das hat auch Risiken und Probleme.

Siehe zum Beispiel: Was ist die effizienteste Binär-Text-Codierung?

Und das: Warum verwenden die Leute nicht basel128?

Eine Sache allerdings, bevor Sie die Antwort akzeptieren, bitte probieren Sie es mit Ihrem Blob aus, ich habe es hauptsächlich für die Komprimierung von utf-8 verwendet, und ich möchte sicher sein, dass es mit Ihren spezifischen Daten funktioniert.

In jedem Fall, hier ist es!

%Vor%

Und wenn Speicher dient ... hier ist, wie Sie es verwenden:

%Vor%

Rgds .... Hoonto / Matt

Außerdem wurde das, was ich gepostet habe, verkleinert, aber verschönert und sehr leicht an die Benutzerfreundlichkeit angepasst. Überprüfen Sie den Link in dem Update für das Original Zeug.

    
hoonto 23.05.2017, 12:25
quelle
1

JS Zip funktioniert gut, korrigieren Sie einfach Ihre Syntax ..

%Vor%

Sie können auch mehrere Dateien hinzufügen ..

Just zip.file wird zip.add

und dann zip.generate () erledigt den Rest .. wie Sie getan haben,

oder verweisen alte Post seinen letzten Teil von JavaScript, und NativeBridge wird hilfreich sein, wenn Sie verwenden können, in diesem Post-Benutzer Datensätze mit Objective C, die Sie ignorieren können, aber sendet dieses Objekt mit JavaScript und Socket, die Sie verwenden können / können ..

Ich hoffe, das wird es tun ...:)

    
MarmiK 24.06.2013 10:09
quelle

Tags und Links