Я хочу отобразить файлы OpenOffice, .odt и .odp в стороне клиента с помощью веб-браузера.
Эти файлы являются заархивированными файлами. Используя Ajax, я могу получить эти файлы от сервера, но это заархивированные файлы. Я должен разархивировать их использующий JavaScript, я попытался использовать inflate.js, http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt, но без успеха.
Как я могу сделать это?
Я написал незиппера в 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.
Пример кода приведен на авторском сайте. Вы можете использовать babelfish для перевода текстов (с японского на английский).
Насколько я понимаю японский язык, этот zip-раздувной код предназначен для декодирования данных (потоков) ZIP, а не ZIP-архива.