Разделение файла перед загрузкой?

на веб-странице можно ли разделить большие файлы на куски до загрузки файла на сервер? Например, разделите файл 10MB на куски 1MB и загрузите по одному куску за раз, показывая индикатор выполнения?

похоже, что JavaScript не имеет никаких возможностей для манипулирования файлами, но как насчет Flash и Java-апплетов?

Это должно работать в IE6+, Firefox и Chrome. обновление: забыл упомянуть ,что (a) мы используем граали и (b) это должно выполняться через https.

4 ответов


вы можете попробовать Plupload. Он может быть настроен для проверки любой среды выполнения, доступной на стороне пользователей, будь то Flash, Silverlight, HTML5, Gears и т. д., и использовать то, что удовлетворяет требуемым функциям в первую очередь. Среди прочего он поддерживает изменение размера изображения (на стороне пользователей, сохраняя данные EXIF(!)), поток и многопартийная загрузка и фрагментация. Файлы могут быть разделены на части на стороне пользователей и отправлены на серверный обработчик chunk-by-chunk (требует дополнительного ухода на сервере), так что большие файлы могут быть загружены на сервер с максимальным пределом размера файла, установленным на значение гораздо ниже, чем их размер, например. И еще.

некоторые среды выполнения поддерживают https, я считаю, некоторые нуждаются в тестировании. Во всяком случае, разработчики там довольно отзывчивы в эти дни. Так что вы могли бы по крайней мере попробовать ;)


единственный вариант, который я знаю, что позволит это будет подписанный Java-апплет.

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


для этого выбора браузеров нет решения JavaScript. Есть файл API но пока он работает в новых версиях Firefox и Chrome, это не произойдет в IE (никаких признаков этого в бета-версиях IE9 пока нет).

в любом случае, чтение файла локально и загрузка его через XMLHttpRequest неэффективны, потому что XMLHttpRequest не имеет возможности отправлять чистый двоичный файл, только текст Unicode. Вы можете кодировать двоичный код в текст с помощью base-64 (или, если вы действительно, нестандартный 7-битная кодировка свой), но это будет менее эффективно, чем обычная загрузка файла.

вы, безусловно, можете делать загрузки с помощью Flash (см. SWFUpload et al) или даже Java, если необходимо (Jumploader... Я бы не беспокоился, в эти дни, хотя, поскольку Распространенность Flash очень высока,и плагин Java продолжает снижаться). Вы не обязательно получите низкоуровневый контроль, чтобы разделить на куски, но вам действительно это нужно? Что? для?

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

Что бы вы ни делали, используйте подход "прогрессивного улучшения", позволяющий браузерам без поддержки возвращаться к простой загрузке HTML. Браузеры обычно имеют индикатор выполнения загрузки для загрузки файлов HTML, он просто имеет тенденцию быть небольшим и легко пропускается.


вам конкретно нужно, чтобы два были в X кусках? Или вы пытаетесь решить проблемы, вызванные загрузкой больших файлов? (например, не удается перезапустить загрузку на стороне клиента, серверная сторона аварийно завершает работу, когда весь файл загружается и хранится в памяти сразу)

поиск компонентов потоковой загрузки. Это зависит от того, с какими технологиями вы работаете, какой компонент вы предпочтете jsp, asp.net, так далее.

http://krystalware.com/Products/SlickUpload/ это побочный продукт сервере Вот еще несколько указателей на различные загрузчики http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx

некоторые пытаются управлять памятью на сервере, например, чтобы весь огромный файл не был в памяти одновременно,некоторые пытаются управлять клиентским интерфейсом.