Разделить файл перед загрузкой? - PullRequest
6 голосов
/ 04 ноября 2010

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

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

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

Ответы [ 4 ]

3 голосов
/ 23 декабря 2010

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

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

2 голосов
/ 04 ноября 2010

Единственный известный мне вариант - разрешить это подписанный Java-апплет.

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

1 голос
/ 04 ноября 2010

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

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

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

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

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

0 голосов
/ 04 ноября 2010

Вам конкретно нужно, чтобы два были в 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

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

...