Rozpakowywanie plików

Chcę wyświetlić pliki OpenOffice ,odt i .odp po stronie klienta za pomocą przeglądarki internetowej.

Te pliki są spakowanymi plikami. Używając Ajax, mogę pobrać te pliki z serwera, ale są to pliki spakowane. Muszę je rozpakować za pomocą JavaScript , próbowałem za pomocą nadmuchać.js, http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt , ale bez powodzenia.

Jak mogę to zrobić?

Author: Qantas 94 Heavy, 2010-01-19

6 answers

Napisałem rozpakowanie w Javascript. To działa.

Opiera się na czytniku plików binarnych Andy ' ego G. P. Na i jakiejś logiki RFC1951 z notmasteryet. Dodałem klasę ZipFile.

Przykład pracy:
http://cheeso.members.winisp.net/Unzip-Example.htm (martwy link)

Źródło:
http://cheeso.members.winisp.net/srcview.aspx?dir=js-unzip (martwy link)

NB : linki są martwe; znajdę nowego hosta wkrótce.

Zawarte w źródle jest plik ZipFile.strona demonstracyjna htm i 3 różne skrypty, jeden dla klasy zipfile, jeden dla klasy inflate i jeden dla klasy binary file reader. Demo zależy również od jQuery i jQuery UI. Jeśli tylko ściągniesz js-zip.plik zip, wszystkie niezbędne źródło jest tam.


Oto jak wygląda kod aplikacji w Javascript:

// In my demo, this gets attached to a click event.
// it instantiates a ZipFile, and provides a callback that is
// invoked when the zip is read.  This can take a few seconds on a
// large zip file, so it's asynchronous. 
var readFile = function(){
    $("#status").html("<br/>");
    var url= $("#urlToLoad").val();
    var doneReading = function(zip){
        extractEntries(zip);
    };

    var zipFile = new ZipFile(url, doneReading);
};


// this function extracts the entries from an instantiated zip
function extractEntries(zip){
    $('#report').accordion('destroy');

    // clear
    $("#report").html('');

    var extractCb = function(id) {
        // this callback is invoked with the entry name, and entry text
        // in my demo, the text is just injected into an accordion panel.
        return (function(entryName, entryText){
            var content = entryText.replace(new RegExp( "\\n", "g" ), "<br/>");
            $("#"+id).html(content);
            $("#status").append("extract cb, entry(" + entryName + ")  id(" + id + ")<br/>");
            $('#report').accordion('destroy');
            $('#report').accordion({collapsible:true, active:false});
        });
    }

    // for each entry in the zip, extract it. 
    for (var i=0; i<zip.entries.length;  i++) {
        var entry = zip.entries[i];

        var entryInfo = "<h4><a>" + entry.name + "</a></h4>\n<div>";

        // contrive an id for the entry, make it unique
        var randomId = "id-"+ Math.floor((Math.random() * 1000000000));

        entryInfo += "<span class='inputDiv'><h4>Content:</h4><span id='" + randomId +
            "'></span></span></div>\n";

        // insert the info for one entry as the last child within the report div
        $("#report").append(entryInfo);

        // extract asynchronously
        entry.extract(extractCb(randomId));
    }
}

Demo działa w kilku krokach: readFile fn jest uruchamiany przez kliknij i tworzy instancję obiektu ZipFile, który odczytuje plik zip. Istnieje asynchroniczne wywołanie zwrotne, gdy odczyt się zakończy (zwykle dzieje się to w czasie krótszym niż sekundę dla rozsądnych rozmiarów zipów) - w tym demo wywołanie zwrotne jest utrzymywane w lokalnej zmiennej doneReading, która po prostu wywołuje extractEntries, które po prostu na ślepo rozpakowuje całą zawartość dostarczonego pliku zip. W prawdziwej aplikacji prawdopodobnie wybierzesz niektóre wpisy do wyodrębnienia (Zezwól użytkownikowi na wybór lub wybierz jeden lub więcej wpisów programowo, itp.).

extractEntries fn iteruje nad wszystkimi wpisami i wywołuje extract() na każdym z nich, przekazując wywołanie zwrotne. Dekompresja wpisu wymaga czasu, może 1s lub więcej dla każdego wpisu w pliku zipfile, co oznacza, że asynchronika jest odpowiednia. Wywołanie zwrotne ekstrakt po prostu dodaje wyodrębnioną zawartość do akordeonu jQuery na stronie. Jeżeli zawartość jest binarna, wtedy zostanie sformatowana jako taka(nie pokazana).


To działa, ale myślę, że użyteczność jest nieco ograniczona.

Po pierwsze: jest bardzo wolny. Rozpakowanie aplikacji 140k zajmuje ~4 sekundy.plik txt z PKWare. Ten sam dekompres można zrobić w mniej niż .5s w programie. NET. EDIT : Javascript ZipFile rozpakowuje się znacznie szybciej niż teraz, w IE9 i w Chrome. Jest nadal wolniejszy niż skompilowany program, ale jest wystarczająco szybki dla normalnego użytkowania przeglądarki.

Dla innego: nie robi streamingu. W zasadzie w całej zawartości zipfile w pamięć. W "prawdziwym" środowisku programistycznym można było czytać tylko metadane pliku zip (powiedzmy 64 bajty na wpis), a następnie odczytywać i dekompresować inne dane zgodnie z potrzebami. Nie ma sposobu, aby zrobić IO w javascript, o ile wiem, dlatego jedyną opcją jest odczytanie całego zip do pamięci i zrobić losowy dostęp w nim. Oznacza to, że będzie nakładać nieuzasadnione wymagania na pamięć systemową dla dużych plików zip. Nie taki problem jak na mniejszy plik zip.

Również: nie obsługa pliku zip" general case " - jest wiele opcji zip, których nie chciałem zaimplementować w rozpakowywaniu-jak szyfrowanie ZIP, Szyfrowanie WinZip, ZIP64, UTF-8 zakodowane nazwy plików, i tak dalej. ( EDIT - obsługuje teraz zakodowane w UTF-8 nazwy plików). Klasa ZipFile zajmuje się jednak podstawami. Niektóre z tych rzeczy nie byłyby trudne do wdrożenia. Mam klasę szyfrowania AES w Javascript; które mogą być zintegrowane w celu obsługi szyfrowania. Obsługa Zip64 prawdopodobnie byłby bezużyteczny dla większości użytkowników Javascript, ponieważ jest przeznaczony do obsługi > 4GB plików zipfiles - nie trzeba wyodrębniać tych w przeglądarce.

nie testowałem również przypadku rozpakowywania zawartości binarnej. Teraz rozpakowuje tekst. Jeśli masz spakowany plik binarny, musisz edytować klasę ZipFile, aby obsłużyć ją poprawnie. Nie wymyśliłem, jak to zrobić. robi teraz także pliki binarne.


EDIT - zaktualizowałem bibliotekę js unzip i demo. Obecnie oprócz tekstu zajmuje się także plikami binarnymi. Uczyniłem go bardziej odpornym i bardziej ogólnym - możesz teraz określić kodowanie, które będzie używane podczas czytania plików tekstowych. Rozszerzone jest również demo-pokazuje m.in. rozpakowywanie pliku XLSX w przeglądarce.

Więc, chociaż myślę, że ma ograniczoną użyteczność i zainteresowanie, to działa. Myślę, że to zadziała w Node.js.
 59
Author: Cheeso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-29 06:24:47

Używam zip.js i wydaje się być całkiem przydatne. Warto zajrzeć!

Sprawdź na przykład demo Unzip .

 23
Author: Dani bISHOP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-17 00:58:46

Znalazłem jszip całkiem przydatne. Do tej pory używałem tylko do czytania, ale mają również możliwości tworzenia/edycji.

Kod mądry to wygląda coś takiego

var new_zip = new JSZip();
new_zip.load(file);
new_zip.files["doc.xml"].asText() // this give you the text in the file

Jedną rzeczą, którą zauważyłem jest to, że wygląda na to, że plik musi być w formacie strumienia binarnego (odczyt za pomocą.readAsArrayBuffer z filereader (), w przeciwnym razie dostawałem błędy mówiąc, że mogę mieć uszkodzony plik zip

 9
Author: AlvaroFG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-10 21:09:41

Przykład kodu jest podany na stronie autora . Możesz użyć babelfish do tłumaczenia tekstów (z japońskiego na angielski).

Z tego co rozumiem to ten kod zip służy do dekodowania danych ZIP (strumieni) a nie archiwum ZIP.

 2
Author: OcuS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 18:20:15

Do tego też napisałem zajęcia. http://blog.another-d-mention.ro/programming/read-load-files-from-zip-in-javascript/ Możesz załadować podstawowe zasoby, takie jak javascript / css / images bezpośrednio z zip za pomocą metod klasowych. Hope it helps

 2
Author: TheBrain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-07 16:33:52

Napisałem "Binary Tools for JavaScript", projekt open source, który zawiera możliwość rozpakowania, unrar i untar: https://github.com/codedread/bitjs

Użyty w moim czytniku komiksów: https://github.com/codedread/kthoom (również open source).

HTH!

 1
Author: codedread,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 10:09:25