Как загружать файлы Chunked в рельсы с помощью существующей загрузки файлов jQuery, я следовал приведенному ниже сценарию, но не смог найти решение
Загрузка фрагментированных файлов поддерживается только браузерами с поддержкой загрузки файлов XHR и API Blob, который включает в себя Google Chrome и Mozilla Firefox 4+.
Настройка на стороне клиента
Чтобы загружать большие файлы небольшими порциями, установите для параметра maxChunkSize (см. "Параметры") предпочтительный максимальный размер порции в байтах:
$ ('# FileUpload'). FileUpload({ maxChunkSize: 10000000 // 10 МБ });
Для частичной загрузки для работы в Mozilla Firefox 4-6 (версии Firefox, поддерживающие загрузку XHR до Firefox 7), для параметра multipart также должно быть установлено значение false - объяснение см. В документации по параметрам на maxChunkSize.
Настройка на стороне сервера
Пример обработчика загрузки PHP поддерживает фрагментированные загрузки из коробки.
Для поддержки фрагментированных загрузок обработчик загрузки использует заголовок Content-Range, который передается плагином для каждого фрагмента.
Как работают фрагментированные загрузки?
Если для maxChunkSize задано целочисленное значение, большее 0, плагин "Загрузка файлов" разбивает файлы с размером файла, превышающим maxChunkSize, на несколько больших двоичных объектов и передает каждый из этих больших двоичных объектов в URL-адрес загрузки в последовательном порядке.
Диапазон байтов большого двоичного объекта передается через заголовок Content-Range.
Имя файла большого двоичного объекта передается через заголовок Content-Disposition.
Callbacks
Загрузка фрагментированных файлов вызывает те же обратные вызовы, что и при обычной загрузке файлов, например, завершенный обратный вызов (см. API) будет запущен только после успешной загрузки последнего большого двоичного объекта.
Загрузки по частям запускают дополнительные обратные вызовы, которые можно использовать для отслеживания событий отдельных загрузок по частям:
$ ('# fileupload'). fileupload ({maxChunkSize: 100000}).on ('fileuploadchunksend', function (e, data) {}).on ('fileuploadchunkdone', function (e, data) {}).on ('fileuploadchunkfail', function (e, data) {}).on ('fileuploadchunkalways', function (e, data) {});
Примечание. Для каждого запроса AJAX, в том числе для загрузки отдельных фрагментов, будут вызываться обратные вызовы, установленные как часть параметров $.ajax (например, успех, ошибка или завершение).
Частичные загрузки между сайтами
По умолчанию браузеры не позволяют использовать все заголовки, используемые для загрузки файлов между сайтами, если они явно не определены как разрешенные для следующих серверных заголовков:
Access-Control-Allow-Headers Content-Type, Content-Range, Content-Disposition
Возобновление загрузки файлов
Используя опцию uploadedBytes (см. Опции), можно возобновить прерванные загрузки:
$ ('# FileUpload'). FileUpload({ maxChunkSize: 10000000, // 10 МБ add: function (e, data) { вар то = это; $.getJSON('server/php/', {file: data.files[0].name}, функция (результат) { var file = result.file; data.uploadedBytes = file && file.size; $.blueimp.fileupload.prototype .options.add.call(это, е, данные); }); } });
Приведенный выше код переопределяет обратный вызов add и отправляет на сервер запрос JSON с текущим именем файла. Если файл с указанным именем существует, сервер отвечает информацией о файле, включая размер файла, который устанавливается как опция uploadedBytes.
Если установлен uploadedBytes, плагин загружает только оставшиеся части файла в виде загрузки BLOB-объектов.
Автоматическое резюме
В следующем фрагменте кода реализована функция автоматического возобновления на основе предыдущего кода:
$ ('# fileupload'). fileupload ({/ *... настройки, как указано выше, плюс следующие... */ maxRetries: 100, retryTimeout: 500, fail: function (e, data) { // фабрика виджетов jQuery использует "namespace-widgetname" начиная с версии 1.10.0: var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'), retries = data.context.data('retries') || 0, retry = function () { $.getJSON('server/php/', {file: data.files[0].name}) .done(function (result) { var file = result.file; data.uploadedBytes = file && file.size; // очистить предыдущие данные: data.data = null; data.submit(); }) .fail(function () { fu._trigger('fail', e, data); }); }; if (data.errorThrown!== 'abort' && data.uploadedBytesЕсли загрузка не удалась, приведенный выше код автоматически возобновит загрузку файла после получения загруженных байтов.
Чтобы предотвратить бесконечные циклы, количество повторных попыток может быть ограничено настройкой maxRetries.
Параметр retryTimeout определяет время ожидания в миллисекундах до возобновления загрузки файла. Это увеличивается для каждой последующей попытки продлить время ожидания.Удаление прерванных фрагментированных загрузок
Если вы не предлагаете своим пользователям возможность возобновления прерванных загрузок, вы можете удалить неполные загрузки с сервера. Рекомендованным способом будет сделать это на стороне сервера, например, с помощью задания cron, удаляющего неполные файлы.
Однако, если вам нужно быстрое решение, можно отправить запрос DELETE, когда загрузка по частям не удалась (например, когда пользователь прерывает загрузку):$ ('# FileUpload'). FileUpload({ maxChunkSize: 10000000, // 10 МБ fail: function (e, data) { $.Ajax({ url: 'server/php/', dataType: 'json', data: {file: data.files[0].name} Тип: УДАЛИТЬ }); } });расширения
- Принудительно повторно загрузить последний кусок