2012-04-23 3 views
1

Я ищу надежный способ создания zip-архива «на лету» из информации на данной странице и сделать это доступным для загрузки. Закрепление на стороне клиента является обязательным, так как мой скрипт запускается из букмарклета.Клиентская сторона с молнией + JavaScript

Мой первый подход, когда я больше беспокоился о написании остальной части сценария, заключался в том, чтобы опубликовать информацию на нескольких строках PHP, работающих на моем локальном сервере, который застегнул ее и отправил обратно. Это явно не подходит для обмена букмарклетами.

Я нашел JSZip ранее сегодня, и я думал, что это будет конец. Эта библиотека отлично работает, когда она работает; к сожалению, архивы, которые я создаю, часто превышают пару МБ, и это нарушает JSZip. (Примечание: я проверял это только на Chrome.)

У Pure JS-загрузок также есть ограничение на напуганное имя из-за URI данных, который я решил решить, используя рекомендованный JSZip метод, используя Downloadify, в котором используется Flash. Это заставило меня задаться вопросом, могут ли быть преодолены ограничения по размеру JS zip, используя аналогичное взаимодействие Flash & JS.

I Googled this, но не имея опыта работы с ActionScript, я не мог быстро понять, возможно ли то, что я прошу. Можно ли использовать объект Flash из JS для создания относительно большого (в 10s МБ) zip-файла на стороне клиента?

Спасибо!

+0

Интересный проект. У меня нет ответа, но если вы это выясните, я бы хотел увидеть полученный букмарклет. –

+0

@DG. Сам проект немного сух. Это утилита для создания архивов каталогов. Я хотел использовать JS, поэтому у меня был бы самый интуитивный интерфейс браузера. Я пошел с букмарклетом, чтобы получить доступ к директории DOM, не нарушая политику одного и того же происхождения. Это создает собственные проблемы. Но, по крайней мере, это интересные проблемы! Я не планировал скоро что-то загружать, так как это беспорядок, но с тех пор, как вы спросили меня, я верю: https://github.com/jnu/index-capture. Это работает для меня, ваш пробег может отличаться. Я надеюсь посмотреть на замену JSZip чем-то в AS сегодня. – joe

+0

Ничего себе. Большое спасибо. И вы столкнулись с множеством проблем, чтобы добавить всю эту документацию. И первый JS через 10 лет! Я глубоко впечатлен. Это довольно интересная и сложная задача, которую вы ставите перед собой. Я еще не пробовал, но я сохранил его как часть моей коллекции букмарклетов для удобного использования в случае необходимости. Как вы думаете, можно ли архивировать изображения с помощью этого? Или, может быть, с некоторыми изменениями? Я думаю, вероятно, будет еще более популярным. –

ответ

2

Прежде всего несколько цифр:

  • флэш обещает, что закачанные будет работать, если файл меньше 100 Мб (я не знаю, означает ли это основание 10 или основание 16).

  • Есть две популярные библиотеки в Flash для создания ZIP-архивов, но сначала прочтите.

  • ZIP архиватор - это программа, которая сжимает и архивирует данные, и делает это именно в этом порядке. То есть он сжимает каждый файл отдельно, а затем добавляет его ко всему архиву. Это дает худшую степень сжатия, но допускает итеративное создание архива. При условии, что вы даже можете начать отправку архива, прежде чем он будет полностью сжат.

  • Альтернатива ZIP - это сначала использовать выделенный архиватор, а затем сжать весь архив за один раз. Это, несколько раз, может добиться в несколько раз лучшего сжатия, но стоимость заключается в том, что вам приходится обрабатывать данные одновременно.

  • Но Flash ByteArray.compress() метод предлагает вам встроенную реализацию алгоритма спускания, что в основном то же самое, что вы использовали бы в архиваторе ZIP. Итак, если вы реализовали что-то вроде tar, вы можете значительно уменьшить размер отправляемых файлов.

  • Но Flash - это среда с одним потоком, поэтому вам нужно быть осторожным с размером данных, которые вы сжимаете, и, возможно, вам придется найти это эмпирически. Или просто используйте ZIP - больше избыточности, но проще реализовать.

Я использовал эту библиотеку раньше: nochump. Не было никаких проблем. Хотя, это несколько старо, и имеет смысл попытаться перенести его на использование кодов Alchemy (которые используются для быстрого доступа к памяти, что значительно снижает стоимость низкоуровневых двоичных арифметических операций, таких как двоичные, двоичные и т. Д.) This library реализует алгоритм CRC32, который является неотъемлемой частью ZIP-архива, и использует Alchemy - поэтому он должен быть значительно быстрее, но вам придется реализовать остальные самостоятельно.

Еще один вариант, который вы можете рассмотреть, это GoCl's NaCl - там вы сможете выбирать из архиватора и реализаций сжатия, потому что он по существу запускает собственный код, поэтому вы можете даже использовать bz2 и другие современные вещи - к сожалению, только в Chrome (и пользователи должны включить его) или Firefox (требуется плагин).

+0

Спасибо! Я дам nochump выстрел. Я бы хотел избежать собственного кода, хотя это было бы шагом вперед с серверной стороны. Я также не должен был бы реализовывать это самостоятельно, но я мог бы дать это, если nochump не удастся. – joe

Смежные вопросы