Разархивирование файлов


Я хочу показать OpenOffice файлы .ОДТ И.ОДП на стороне клиента с помощью веб-браузера.

эти файлы являются сжатыми файлами. Используя Ajax, я могу получить эти файлы с сервера, но это сжатые файлы. Я должен распаковать их с помощью JavaScript, Я пробовал использовать надуть.js,http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt, но безуспешно.

Как я могу это сделать?

6 59

6 ответов:

я написал unzipper в Javascript. Это работает.

он полагается на Andy G. P. Na's binary file reader и некоторые RFC1951 раздувают логику от notmasteryet. Я добавил класс ZipFile.

рабочий пример:
http://cheeso.members.winisp.net/Unzip-Example.htm (мертвая ссылка)

источник:
http://cheeso.members.winisp.net/srcview.aspx?dir=js-unzip (мертв ссылка)

NB: ссылки мертвы; я скоро найду новый хост.

в исходном файле находится ZipFile.демонстрационная страница htm и 3 различных скрипта, один для класса zipfile, один для класса inflate и один для класса чтения двоичных файлов. Демонстрация также зависит от jQuery и jQuery UI. Если вы просто загрузите JS-zip.zip-файл, все необходимые источники есть.


вот как выглядит код приложения в 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));
    }
}

демо работает в несколько шагов:readFile FN запускается щелчком мыши и создает экземпляр объекта ZipFile, который считывает zip-файл. Существует асинхронный обратный вызов для завершения чтения (обычно это происходит менее чем за секунду для молний разумного размера) - в этой демонстрации обратный вызов выполняется в локальной переменной doneReading, которая просто вызывает extractEntries, которым просто вслепую распаковывает все содержимое предоставленного zip-файла. В Реале приложение вы, вероятно, выберете некоторые из записей для извлечения (разрешить пользователю выбирать или выбирать одну или несколько записей программно и т. д.).

The extractEntries FN перебирает все записи и вызывает extract() на каждом из них, передавая обратный вызов. Распаковка записи занимает время, может быть, 1s или более для каждой записи в zipfile, что означает, что асинхронность подходит. Обратный вызов extract просто добавляет извлеченное содержимое в аккордеон jQuery на странице. Если содержимое является двоичным, затем он форматируется как таковой (не показано).


это работает, но я думаю, что программа несколько ограничена.

во-первых: это очень медленно. Требуется ~4 секунды, чтобы распаковать 140k AppNote.txt файл из PKWare. То же самое распаковка может быть сделано менее чем .5s в программе .NET.EDIT: Javascript ZipFile распаковывается значительно быстрее, чем это сейчас, в IE9 и в Chrome. Это все еще медленнее, чем скомпилированная программа, но это достаточно быстро для нормального использования браузера.

для другого: он не делает потоковое. Он в основном хлебает все содержимое zipfile в память. В "реальной" среды программирования, вы можете читать только метаданные zip-файл (скажем, 64 байта на запись), а затем читать и распаковывать другие данные по желанию. Насколько я знаю, нет никакого способа сделать IO таким образом в javascript, поэтому единственный вариант-прочитать весь zip в память и сделать в нем произвольный доступ. Этот это означает, что он будет предъявлять необоснованные требования к системной памяти для больших zip-файлов. Не так много проблем для меньшего zip-файла.

кроме того: он не обрабатывает zip-файл "общий случай" - есть много вариантов zip, которые я не потрудился реализовать в unzipper - like ZIP encryption, WinZip encryption, zip64,UTF-8 кодированные имена файлов, и так далее. (EDIT - теперь он обрабатывает имена файлов в кодировке UTF-8). Класс, zip-файл, хотя ручки основы. Некоторые этих вещей не было бы трудно реализовать. У меня есть класс шифрования AES в Javascript; это может быть интегрировано для поддержки шифрования. Поддержка Zip64, вероятно, бесполезна для большинства пользователей Javascript, поскольку она предназначена для поддержки >4GB zipfiles - не нужно извлекать их в браузере.

я также не проверял случай для распаковки двоичного содержимого. Прямо сейчас он распаковывает текст. Если у вас есть сжатый двоичный файл, вам нужно будет отредактировать ZipFile класса, чтобы справиться с этим должным образом. Я не знал, как это сделать чисто. теперь он тоже делает двоичные файлы.


EDIT - я обновил библиотеку JS unzip и демо. Теперь он делает двоичные файлы, в дополнение к тексту. Я сделал его более устойчивым и более общим - теперь вы можете указать кодировку для использования при чтении текстовых файлов. Также демо расширяется - он показывает распаковку XLSX-файла в браузере, среди прочего.

Итак, пока я думаю, что это имеет ограниченную полезность и интерес, это работает. Я думаю, это будет работать в узле.js.

Я использую zip.js и это, кажется, довольно полезно. Это стоит посмотреть!

Регистрация распаковать демо, например.

нашел jszip весьма полезно. Я использовал до сих пор только для чтения, но у них есть возможности создания/редактирования.

код мудрый это выглядит примерно так

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

одна вещь, которую я заметил, что кажется, что файл должен быть в двоичном формате потока (читать с помощью.readAsArrayBuffer of FileReader (), в противном случае я получал ошибки, говоря, что у меня может быть поврежден zip-файл

приведен пример кода на сайте автора. Вы можете использовать годы для перевода текстов (с Японского на английский).

насколько я понимаю японский язык, этот zip-код предназначен для декодирования ZIP-данных (потоков), а не ZIP-архива.

Я написал класс для этого тоже. http://blog.another-d-mention.ro/programming/read-load-files-from-zip-in-javascript/ Вы можете загрузить основные ресурсы, такие как javascript/css/images непосредственно из zip, используя методы класса. Надеюсь, это поможет

Я написал "Binary Tools for JavaScript", проект с открытым исходным кодом, который включает в себя возможность распаковки, unrar и untar:https://github.com/codedread/bitjs

используется в моем читателе комиксов:https://github.com/codedread/kthoom (также с открытым исходным кодом).

НТН!