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