Разархивация файлов

Я хочу отобразить файлы OpenOffice, .odt и .odp в стороне клиента с помощью веб-браузера.

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

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

70
задан Qantas 94 Heavy 15 February 2014 в 04:02
поделиться

2 ответа

Я написал незиппера в JavaScript. Оно работает.

Это зависит от Andy G.P. NA двоичный файл-считыватель и Некоторые RFC1951 надувают логику от NotMasteryet . Я добавил класс zipfile.

Рабочий пример:
http://cheeso.members.winisp.net/unzip-example.htm (Dead Link)

Источник:
http: //cheeSo.members. winisp.net/srcview.aspx?dir=js-unzip (Dead Link)

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

Включено в источник - это демонстрационная страница zipfile.htm и 3 различных сценария, одна для класса zipfile, один для класса надувки, и один для двоичного класса читателя файлов. Демо также зависит от 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 ReadFile FN срабатывает щелчок, а также создает объект zipfile, который читает zip файл. Там есть асинхронный обратный вызов, когда прочитанный завершен (обычно происходит менее чем в секунду для разумно размером Zips) - в этом демонстрационном обратном вызове проводится в локальной переменной доне, которая просто вызывает , которые Просто вслепую расстегните все содержимое предоставленного ZIP-файла. В реальном приложении вы, вероятно, выбрали бы некоторые из записей для извлечения (позволяют пользователю выбрать или выбрать один или несколько записей в процессе программ и т. Д.).

Экстрагирование Fn Iterate по всем записям, и вызовы экстракт () на каждом из них, передавая обратный вызов. Декомпрессия ввода требует времени, возможно, 1S или более для каждой записи в Zipfile, что означает асинхронность. Обратный вызов выписки просто добавляет извлеченный контент на аккордеон jQuery на странице. Если содержимое является двоичным, то он отформатирован как таковой (не показан).


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

Для одной вещи: это очень медленно. Занимает ~ 4 секунды, чтобы расстегнуть файл 140K appnote.txt с pkware. Тот же расщелчик может быть сделан менее чем на 0,5с в программе .NET. Редактировать : JavaScript Zipfile распаковывается значительно быстрее, чем сейчас, в IE9 и в Chrome. Он все еще медленнее, чем скомпилированная программа, но она достаточно быстро для обычного использования браузера.

Для другого: он не делает потоковой передачей. Он в основном переселен во всем содержимом ZipFile в память. В «реальной» среде программирования вы могли бы прочитать только метаданные ZIP-файла (скажем, 64 байта на ввод), а затем прочитайте и распаковывать другие данные по желанию. Там нет способа сделать так, чтобы в JavaScript, насколько я знаю, поэтому единственный вариант - прочитать всю почту в память и делать произвольный доступ в нем. Это означает, что он будет разместить необоснованные требования к системной памяти для больших zip-файлов. Не столько проблема для меньшего zip-файла.

также: он не обрабатывает «общего корпуса» ZIP-файла - есть много вариантов zip, которые я не удосужился реализовать в незиппере - как шифрование ZIP, шифрование Winzip, Zip64, UTF- 8 Кодированные имена файлов, и так далее. ( Отредактируйте - это обрабатывает кодировку NOTF-8 сейчас). Хотя класс ZipFile обрабатывает основы. Некоторые из этих вещей не будут трудно реализовать. У меня класс шифрования AES в JavaScript; Это может быть интегрировано для поддержки шифрования. Поддержка Zip64, вероятно, бесполезно для большинства пользователей JavaScript, так как он предназначен для поддержки> 4GB ZipFiles - не нужно извлечь их в браузере.

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


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

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

61
ответ дан 24 November 2019 в 13:28
поделиться

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

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

2
ответ дан 24 November 2019 в 13:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: