Требуется помощь, подскажите как упаковать файлы и отдать их на скачивание пользователю без ожидания завершения компрессации файлов..кхм.. отдавать то, что успело упаковаться .. как то так..
> Требуется помощь, подскажите как упаковать файлы и отдать их на скачивание пользователю
> без ожидания завершения компрессации файлов..
> кхм.. отдавать то, что успело упаковаться .. как то так..как мне кажется задача не так проста как кажется на первый взгляд.
нужно короче смотреть в сторону HTTP streaming решений(если у вас транспорт конечно HTTP).Т.е. надо чанки уже готовые на сервер-сайде отдавать по HTTP-каналу(постоянно открытому причём - что уже не тривиально).
+ ещё клиентская сторона - должна держать это соединение - и собирать чанки в полный архивный файл и после приёма валидировать и выдавать пользователю - "Сохранить файл?" - клиентская часть это JS.Вот вроде набор фреймворков для подобного решения:
http://ajaxpatterns.org/HTTP_StreamingА вот похожее решение на базе Node.js
http://stackoverflow.com/questions/2558606/stream-data-with-...Также рекомендую использовать готовую библиотеку(http://socket.io/#how-to-use)- т.к. стриминг в каждом браузере может быть по разному реализован - кто-то умеет web sockets а кто-то только flash. Библиотека-обёртка берёт все эти сложности на себя предоставля высокоуровнее API.
>[оверквотинг удален]
> чанки в полный архивный файл и после приёма валидировать и выдавать
> пользователю - "Сохранить файл?" - клиентская часть это JS.
> Вот вроде набор фреймворков для подобного решения:
> http://ajaxpatterns.org/HTTP_Streaming
> А вот похожее решение на базе Node.js
> http://stackoverflow.com/questions/2558606/stream-data-with-...
> Также рекомендую использовать готовую библиотеку(http://socket.io/#how-to-use)- т.к.
> стриминг в каждом браузере может быть по разному реализован - кто-то
> умеет web sockets а кто-то только flash. Библиотека-обёртка берёт все эти
> сложности на себя предоставля высокоуровнее API.Премного благодарен!.. буду ковырять в эту сторону..
Ещё раз спасибо!
>[оверквотинг удален]
> чанки в полный архивный файл и после приёма валидировать и выдавать
> пользователю - "Сохранить файл?" - клиентская часть это JS.
> Вот вроде набор фреймворков для подобного решения:
> http://ajaxpatterns.org/HTTP_Streaming
> А вот похожее решение на базе Node.js
> http://stackoverflow.com/questions/2558606/stream-data-with-...
> Также рекомендую использовать готовую библиотеку(http://socket.io/#how-to-use)- т.к.
> стриминг в каждом браузере может быть по разному реализован - кто-то
> умеет web sockets а кто-то только flash. Библиотека-обёртка берёт все эти
> сложности на себя предоставля высокоуровнее API.Фантазия это конечно хорошо, но лучше будет, если фантазия будет основываться на _понимании_.
1) Если не критично, какой тип архива будет использоваться для передачи, то nginx + модуль zip умеет в потоке отдавать файлы, собранные воедино, но без компрессии.
2) Если это нечто самописное, то наверное вам нужен поточный архиватор типа связки tar + gz. ну а дальше - gz умеет выдавать сжатый поток на stdout. Вывода на stdout как раз и ожидают веб-сервера, исполняющие скрипты. Т.е. нужно в коде вашего скрипта сделать system ('tar -czf /path/') и всё.
Фантазии про JS, Flash, Chunking, NodeJs - всё это фантазии.
> Фантазии про JS, Flash, Chunking, NodeJs - всё это фантазии.вполне допускаю что я подошёл с излишне программистской точки зрения :) и вариант с потоковым выводом рабочий - нужно экспериментировать.
system('tar -c /some/path/* | gzip ');
> system('tar -c /some/path/* | gzip ');вариант слегка не рабочий:( может какие-то ключики поправить?
sm00th@dev:~$ tar -c django/admintool/* | gzip
gzip: compressed data not written to a terminal. Use -f to force compression.
For help, type: gzip -hа ну да сказано что "-f" добавить же:)
+ надо HTTP-header будет добавить(MimeType, Content-Disposition) - чтобы браузер понял что это бинарный файл а не страничка - типа так:
mimetype='application/vnd.ms-excel'
Content-Disposition= 'attachment; filename=%s'
>> system('tar -c /some/path/* | gzip ');
> вариант слегка не рабочий:( может какие-то ключики поправить?помоему при вызове из system() будет работать, потому что оно поймет что это не терминал (вроде).
> sm00th@dev:~$ tar -c django/admintool/* | gzip
> gzip: compressed data not written to a terminal. Use -f to force
> compression.
> For help, type: gzip -h
> а ну да сказано что "-f" добавить же:)
> + надо HTTP-header будет добавить(MimeType, Content-Disposition) - чтобы браузер понял
> что это бинарный файл а не страничка - типа так:
> mimetype='application/vnd.ms-excel'
> Content-Disposition= 'attachment; filename=%s'обязательно.