Может ли кто-нибудь дать рациональное объяснение того, почему веб-сервер должен помогать в создании индикаторов загрузки? - PullRequest
4 голосов
/ 03 июня 2009

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

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

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

Подумайте об этом: ваш браузер открывает сокет для удаленного сервера и начинает отправку данных. Ваш браузер точно знает, сколько байтов должно быть отправлено, и, благодаря магии подтверждений TCP, также знает, сколько байтов поступило на серверную сторону. Так почему же во Имя Летающего Спагетти-Монстра нет простого способа представить эти данные в Javascript без суеты с взорванным сервером?

Ответы [ 3 ]

6 голосов
/ 03 июня 2009

Истинным ограничением здесь являются HTML-формы. Они были изобретены более 10 лет назад, когда загрузка больших файлов казалась совершенно невозможной. Таким образом, они предоставляют вам только один обратный вызов: когда вся загрузка завершена (параметр ACTION).

К счастью, есть несколько бесплатных загрузчиков на основе флэш-памяти, которые предлагают индикаторы выполнения. Не волнуйтесь, большинство из них будут изящно ухудшаться (предоставляя простое поле загрузки файла, если у пользователя нет флэш-памяти). Все параметры можно контролировать с помощью Javascript. И они не требуют специальной серверной инфраструктуры.

Проверьте swfupload.org

2 голосов
/ 12 апреля 2013

Теперь это возможно в большинстве браузеров, кроме IE (все версии).

JavaScript довольно прост. Проверьте проект веб-папки на sourceforge.net. Показывает% загрузки для всех браузеров, поддерживающих HTML5.

 function upload() {
   document.folder.encoding = "multipart/form-data";
   if (document.folder.file.files) { 
       var xhr = new XMLHttpRequest();
        var fd = new FormData(document.folder);
        /* event listeners */
        xhr.upload.addEventListener("progress", uploadProgress, false);
        xhr.addEventListener("load", uploadComplete, false); // loadend if doesn't matter success or not 
        xhr.addEventListener("error", uploadError, false);
        xhr.open("POST", document.folder.action, true);
        fd.append('submit', 'Upload'); // keep consistent with view, so maybe return method in view
        fd.append('background', '1');
        xhr.send(fd); 
        return false;
   }
   return true;
}


function uploadProgress(evt) {
    if (evt.lengthComputable) {
        var per = (evt.loaded*100/evt.total).toFixed(0)+'%';
        getElement('_progress').innerHTML = per;
        document.title = 'Upload ('+per+')';
    }   else {
        getElement('_progress').innerHTML = evt.loaded;
    }
}

function uploadComplete(evt) {
    getElement('_progress').innerHTML = '100%';
    window.location.reload();
}

function uploadError(evt) {
    getElement('_progress').innerHTML = 'error';
}

У меня также есть код, отображающий индикатор прогресса для сайтов с более интересными возможностями.

0 голосов
/ 03 июня 2009

Я полностью согласен, к сожалению, нет стандартного API для этого в разных браузерах. Однако, даже если бы он существовал, сервер должен был бы участвовать. Вы не можете доверять тому, сколько данных вы отправили, HTTP требует подтверждения. Поэтому вам нужно, чтобы сервер сообщал вам, если датаграмма # 526 получена. Если бы существовал API, это было бы хорошим предположением, но на самом деле это не одно и то же: S

Проверьте www.faqs.org/rfcs/rfc1867.html

Если вы можете пропинговать сервер, вы можете смоделировать его (без уверенности).

...