2009-06-03 6 views
4

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

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

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

Подумайте об этом: ваш браузер открывает сокет удаленному серверу и начинает отправлять данные. Ваш браузер точно знает, сколько байтов должно быть отправлено, и, благодаря волшебству подтверждений TCP, также известно, сколько байтов поступило на сервер. Так почему же в названии The Flying Spaghetti Monster нет простого способа представить эти данные в Javascript без поиска с помощью взрывающегося сервера?

ответ

0

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

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

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

+0

+1 "нет стандартного api". Однако я не согласен с вашим мнением о том, что помощь сервера будет необходима для предоставления информации о ходе. Просто зная, сколько от общего количества байтов, которые должны быть отправлены, передано TCP для транспорта, обеспечит достаточно значимый индикатор выполнения. – AnthonyWJones

+0

Вам не нужно было догадываться. Эти данные легко доступны для всех, кто может объединить клиент Berkeley Sockets TCP ... который будет включать в себя любую команду программного обеспечения браузера. – Sniggerfardimungus

6

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

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

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

+0

swfupload отлично. Я использовал его много.+1 от меня :) –

2

Можно с большей частью любого веб-браузера теперь, кроме IE (все версии).

JavaScript довольно прост. Проверьте проект webfolder на 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

Это будет работать с IE10. –

+0

Это может быть правильно, просто я не могу проверить. О странице моего IE10 отображается как 10.0.9200.16519, но пользовательский агент показывает как Mozilla/4.0 (совместимый, MSIE 7.0, Windows NT 6.2, WOW64; .. так что IE10 работает в режиме совместимости с HTML4, и я не могу понять, как push он должен использовать HTML5, поэтому этот код не работает. – Singagirl

+0

Вероятно, вы работаете в режиме совместимости с IE7. –