2013-03-07 12 views
6

muszę przechowywać dużą ilość tekstu w WebSQl, więc zdecydowałem się skompresować tekst z zip.js i przechowywania sprężonego Blobsjavascript - zip kropelka z zip.js

Z dokumentacji można skompresować blob w następujący sposób:

function zipBlob(filename, blob, callback) { 
    // use a zip.BlobWriter object to write zipped data into a Blob object 
    zip.createWriter(new zip.BlobWriter("application/zip"), function(zipWriter) { 
     // use a BlobReader object to read the data stored into blob variable 
     zipWriter.add(filename, new zip.BlobReader(blob), function() { 
     // close the writer and calls callback function 
     zipWriter.close(callback); 
     }); 
    }, onerror); 
} 

Chociaż to działa, nie rozumiem, dlaczego musisz podać nazwę pliku. Czy to naprawdę konieczne? I czy ten plik jest zawsze usuwany po kompresji?

Cheers

Odpowiedz

3

Sprawdź tę odpowiedź tutaj - nie wymaga nazwy pliku, a założę się, że jej o wiele łatwiejsze w użyciu. Próbowałem już kilku implementacji kompresji/dekompresji w javascriptach i zostały ukąszone przez problemy, takie jak ograniczenia rozmiaru oryginalnych danych, ogólna szybkość, efektywność i tak dalej. Jest dziwnie trudno znaleźć dobrą realizację kompresji/dekompresji w javascript, ale na szczęście tym razem nie udało się jeszcze do mnie (i użyłem go trochę):

Compressing a blob in javascript

Realizacja masz obecnie wymaga nazwy pliku, ponieważ stara się zachować spójność z plikiem ZIP, dzięki czemu można go zapisać na przykład na pulpicie i otworzyć za pomocą ulubionego narzędzia zip. Wygląda na to, że twoje wyzwanie jest bardzo podobne do mojego, muszę zapisać i przywrócić skompresowane elementy z lokalnego magazynu w przeglądarce, a także na serwerze.

+0

bardzo miłe! Chociaż kompresja nie jest tak dobra jak w przypadku zip.js, ale wciąż jest bardzo interesującą alternatywą !! thnx –

+0

Moja przyjemność Jeanluca, cieszę się, że to może być potencjalna alternatywa dla ciebie. Tak, zdecydowanie istnieje wiele przypadków, w których zip ma znacznie większą wydajność LZJB z punktu widzenia kompresji. W przypadku niektórych danych będzie to mniej więcej tak samo ekwiwalentne; jest jednak ultraszybki i jeśli robisz tę prędkość po stronie przeglądarki, zazwyczaj jest to bardzo ważne. I zawsze jest taka korzyść z tego, że jest łatwiejszy w użyciu dla programisty, przynajmniej z mojego doświadczenia. Jest tam także kilka ukrytych metod kodowania/dekodowania base64, których nie ujawniłem w nieco zmodyfikowanej wersji w poście, jeśli ich potrzebujesz. – hoonto

+0

Jeanluca, zostawiając notatkę dla ciebie na wszelki wypadek - w moim przykładzie w tym przykładzie było literówka, brakowało średnika po deklaracji obiektu fastcompressor na górze. Więc chciałeś, żebyś był tego świadomy. Właśnie to naprawiłem. – hoonto

2

Nazwa pliku jest niezbędna zgodnie z tą implementacją. Nie byłoby to konieczne, gdybyś kompresował tylko dane, ale zip.js tworzy pliki zip, które przechowują pliki, które muszą mieć nazwy plików.

W swoim oryginalnym przykładzie, zipWriter.add() skutecznie konwertuje twój obiekt blob do nowego pliku i dodaje go do pliku zip - a parametr "filename" jest nazwą, którą ma mieć nowy plik.

Oto przykład, który używa zip.js dodać wiele plamy na zamek błyskawiczny, a następnie pobiera go z FileSaver.js:

function zipBlob() { 
    zip.createWriter(new zip.BlobWriter("application/zip"), function(writer) { 
     files = ["abcd", "123"]; 
     var f = 0; 

     function nextFile(f) { 
      fblob = new Blob([files[f]], { type: "text/plain" }); 
      writer.add("file"+f, new zip.BlobReader(fblob), function() { 
       // callback 
       f++; 
       if (f < files.length) { 
        nextFile(f); 
       } else close(); 
      }); 
     } 

     function close() { 
      // close the writer 
      writer.close(function(blob) { 
       // save with FileSaver.js 
       saveAs(blob, "example.zip"); 
      }); 
     } 

     nextFile(f); 

    }, onerror); 
}