Плагин jquery-file-upload застрял в бесконечном цикле, повторно отправляя те же данные после 2 ГБ

Использование плагина 'https://github.com/blueimp/jQuery-File-Upload. для загрузки файла размером 4 ГБ через куски по 100 МБ. Изучил взаимодействие клиент-сервер, заметил, что загрузка не удалась после загрузки 2 ГБ. Изучив консоль firebug, оказалось, что подключаемый модуль пытается повторно отправить тот же фрагмент размером 100 МБ в диапазоне содержимого 2 ГБ. Я иллюстрирую заголовки запроса/ответа ниже, а также ответ, полученный от сервера с использованием библиотеки php по умолчанию, предоставляемой плагином.

Первый вывод представляет передачу 1,8–1,9 ГБ. Второй вывод представляет передачу 1,9–2 ГБ. Третий вывод — это то, что происходит во время следующего запроса AJAX. Похоже, что он пытается передать другую часть, сервер теперь отвечает немного другим сообщением JSON, устанавливая для атрибута «тип» значение «multipart/form-data» вместо обычного «video/mp4», которое он возвращал ранее. Jquery-file-upload на клиенте будет продолжать отправлять дальнейшие запросы AJAX на сервер с тем же диапазоном, пока он не будет остановлен вручную.

Серверная среда Apache/2.2.22, «PHP 5.3.10-1ubuntu3.7 с Suhosin-Patch», «Ubuntu 12.04.1 LTS».

Клиентская среда Windows 7, Firefox 24.

Реализация Javascript на стороне клиента:

<script src="/js/vendor/jquery.ui.widget.js"></script>
<script src="/js/jquery.iframe-transport.js"></script>
<script src="/js/jquery.fileupload.js"></script>

<script>
$(function () {
   'use strict';

    $('#fileupload').fileupload({
     maxChunkSize: 100000000, // 100 MB   */
    url: '/uploadify/jquery_video_upload_submit',
    dataType: 'json',
    done: function (e,data) {
        $.each(data.result.files, function (index, file) {
            $('<p/>').text(file.name).appendTo('#files');
        });
    },
    progressall: function (e, data) {
        var progress = parseInt(data.loaded / data.total * 100, 10);
        $('#progress .progress-bar').css(
            'width',
            progress + '%'
        );
    }
}).prop('disabled', !$.support.fileInput)
    .parent().addClass($.support.fileInput ? undefined : 'disabled');
});
</script>

Реализация на стороне сервера

public function jquery_video_upload_submit(){   
    $this->output->set_header('Content-Type: application/json; charset=utf-8');
    error_reporting(E_ALL | E_STRICT);
    $this->load->library('uploadHandler');
}

Наблюдаемый результат 1:

Заголовки ответов

Access-Control-Allow-Cred...    false
Access-Control-Allow-Head...    Content-Type, Content-Range, Content-Disposition
Access-Control-Allow-Meth...    OPTIONS, HEAD, GET, POST, PUT, PATCH, DELETE
Access-Control-Allow-Orig...    *
Cache-Control   no-store, no-cache, must-revalidate
Connection  Keep-Alive
Content-Disposition inline; filename="files.json"
Content-Length  204
Content-Type    application/json; charset=utf-8
Date    Mon, 21 Oct 2013 15:02:28 GMT
Keep-Alive  timeout=5, max=93
Pragma  no-cache
Range   0-1899999999
Server  Apache/2.2.22 (Ubuntu)
Vary    Accept
X-Content-Type-Options  nosniff

Заголовки запроса

Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Disposition attachment; filename="block%20burner%20movie%2011.1.10(1).mp4"
Content-Length  100000211
Content-Range   bytes 1800000000-1899999999/4122624072
Content-Type    multipart/form-data; boundary=---------------------------1694899034803
Cookie  ci_session=****;         
Host    dev.****.tv
Referer http://dev.****.tv/tests/jqueryfileupload
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
X-Requested-With    XMLHttpRequest

ОТВЕТ:

{"files":[{"name":"block burner movie 11.1.10(1).mp4","size":1900000000,"type":"video\/mp4","deleteUrl":"http:\/\/dev.****.tv\/?file=block%20burner%20movie%2011.1.10%281%29.mp4","deleteType":"DELETE"}]}

Наблюдаемый результат 2:

Заголовки ответов

Access-Control-Allow-Cred...    false
Access-Control-Allow-Head...    Content-Type, Content-Range, Content-Disposition
Access-Control-Allow-Meth...    OPTIONS, HEAD, GET, POST, PUT, PATCH, DELETE
Access-Control-Allow-Orig...    *
Cache-Control   no-store, no-cache, must-revalidate
Connection  Keep-Alive
Content-Disposition inline; filename="files.json"
Content-Length  204
Content-Type    application/json; charset=utf-8
Date    Mon, 21 Oct 2013 15:03:27 GMT
Keep-Alive  timeout=5, max=92
Pragma  no-cache
Range   0-1999999999
Server  Apache/2.2.22 (Ubuntu)
Vary    Accept
X-Content-Type-Options  nosniff

Заголовки запроса

Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Disposition attachment; filename="block%20burner%20movie%2011.1.10(1).mp4"
Content-Length  100000215
Content-Range   bytes 1900000000-1999999999/4122624072
Content-Type    multipart/form-data;   boundary=---------------------------280133237112097
Cookie  ci_session=****
Host    dev.****.tv
Referer http://dev.****.tv/tests/jqueryfileupload
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
X-Requested-With    XMLHttpRequest

ОТВЕТ

{"files":[{"name":"block burner movie 11.1.10(1).mp4","size":2000000000,"type":"video\/mp4","deleteUrl":"http:\/\/dev.****.tv\/?file=block%20burner%20movie%2011.1.10%281%29.mp4","deleteType":"DELETE"}]}

Наблюдаемый результат 3:

Заголовки ответов

Access-Control-Allow-Cred...    false
Access-Control-Allow-Head...    Content-Type, Content-Range, Content-Disposition
Access-Control-Allow-Meth...    OPTIONS, HEAD, GET, POST, PUT, PATCH, DELETE
Access-Control-Allow-Orig...    *
Cache-Control   no-store, no-cache, must-revalidate
Connection  close
Content-Disposition inline; filename="files.json"
Content-Length  266
Content-Type    application/json; charset=utf-8
Date    Mon, 21 Oct 2013 15:04:26 GMT
Pragma  no-cache
Range   0-1999999999
Server  Apache/2.2.22 (Ubuntu)
Vary    Accept
X-Content-Type-Options  nosniff

Заголовки запроса

Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Disposition attachment; filename="block%20burner%20movie%2011.1.10(1).mp4"
Content-Length  100000213
Content-Range   bytes 2000000000-2099999999/4122624072
Content-Type    multipart/form-data; boundary=---------------------------23653531328930
Cookie  ci_session=****
Host    dev.****.tv
Referer http://dev.****.tv/tests/jqueryfileupload
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
X-Requested-With    XMLHttpRequest

ОТВЕТ

{"files":[{"name":"block burner movie 11.1.10(1).mp4","size":2000000000,"type":"multipart\/form-data; boundary=---------------------------23653531328930","deleteUrl":"http:\/\/dev.****.tv\/?file=block%20burner%20movie%2011.1.10%281%29.mp4","deleteType":"DELETE"}]}

person Barthalameu James Simpson    schedule 21.10.2013    source источник
comment
застрявший на 2 гигабайтах предполагает, что ваш клиент находится на 32-битной платформе, которая обычно имеет ограничение на размер файла 2,1 гигабайта (2 ^ 31-1) для таких вещей.   -  person Marc B    schedule 22.10.2013
comment
Где-то есть ограничение в 2 ГБ, но клиент работает под управлением Windows 7, 64-битная, строка пользовательского агента подтверждает это с помощью «WOW64». Я проверил Firefox, однако они не делают конкретных 32/64-битных версий для Windows в соответствии с support.mozilla.org/en-US/questions/954794   -  person Barthalameu James Simpson    schedule 22.10.2013
comment
wow64 означает, что это 32-битный уровень эмуляции для 64-битной системы, например. это 32-битный Firefox, который работает на 64-битной Windows. так что да ... окна могут быть 64-битными, но Firefox все еще застрял в 32-битной стране со всеми сопутствующими ограничениями.   -  person Marc B    schedule 22.10.2013
comment
Привет, Марк! Я создал новую виртуальную машину в AWS и протестировал Chrome, IE 10 и Firefox. Chrome и IE10 работали нормально, Firefox умер на случайных 1,4 ГБ. Я измерял ЦП/память и заметил, что Firefox чрезмерно использует ресурсы. В Firefox я использую «Firebug» для просмотра заголовков запросов и ответов, когда я отключил это, Firefox завершил работу УСПЕШНО!!! Похоже, вы правы в том, что в браузере есть ограничение, особенно в Firebug ADD ON, он не может обрабатывать большие файлы. Я собираюсь продолжить тестирование на исходном клиенте и повторить все эти тесты.   -  person Barthalameu James Simpson    schedule 22.10.2013


Ответы (1)


Похоже, это проблема Firefox Firebug. Firebug будет реагировать непредсказуемым образом, если вы попытаетесь загрузить большие файлы + 2 ГБ в виде больших двоичных объектов и попытаться их разрезать. Отключение Firebug перед запуском тестов работает нормально, поскольку Firefox может без проблем потреблять большие файлы (+4 ГБ) и нарезать их (на куски).

person Barthalameu James Simpson    schedule 28.10.2013