В соответствии с требованиями your comment, приведено более полное описание my comment.
Что касается отслеживания загрузки, это возможно без необходимости писать определенный серверный код для поддержки отслеживания загрузки. Как вы уже упоминали, я говорил о onprogress
event provided by XMLHttpRequest level 2. Он довольно прост в использовании.Обратите внимание на небольшой участок ссылке, которую я только что говорил:
var oReq = new XMLHttpRequest();
oReq.addEventListener("progress", updateProgress, false);
oReq.open();
oReq.send(something);
// progress on transfers from the server to the client (downloads)
function updateProgress (oEvent) {
if (oEvent.lengthComputable) {
var percentComplete = oEvent.loaded/oEvent.total;
// ...
} else {
// Unable to compute progress information since the total size is unknown
}
}
Как другой пункт упоминается в вашем вопросе:
Я хотел бы провести различие между «Загрузка файла» и " ожидая ответа ", поэтому я могу показать соответствующие сообщения/индикаторы и т. д. пользователю.
Это, безусловно, возможно в теории. Что я делаю в библиотеке загрузки кросс-браузера, которую я поддерживаю, Fine Uploader, ждет, пока последний байт не будет отправлен (в соответствии с моим обработчиком хода), а затем добавьте сообщение рядом с файлом в пользовательском интерфейсе, например «обработка». . ". Я предположил, что по мере отправки последнего байта сервер выполняет некоторые задачи в файле, и теперь я просто жду ответа.
Я сказал, что это можно обнаружить теоретически, но не на практике кросс-браузер. Зачем? Я прокомментировал это в a case in the Fine Uploader Github repository. Я буду включать полноту мой комментарий здесь:
Я заметил, что Firefox не срабатывает его последнее событие прогресса, пока не получает ответ от сервера, который является немного лентяй. Существует Firefox issue, поданный для отслеживания этой «проблемы».
Похоже, что Firefox действительно может следовать букве спецификации XHR V2, в то время как Chrome придерживается «духа» спецификации. Выполнение Chrome, которое приводит к последнему событию прогресса , выпущенному после последнего байта, было «отправлено», что больше всего может ожидать, но это может быть просто нарушением спецификации. Не уверен, что IE10 еще не , поскольку я еще не изучал это. Разработчик FF открыл нить на странице w3.org с просьбой о некоторых разъяснениях.
Chromium dev считает, что «ожидаемое» поведение на самом деле является webkit , а не для Chrome. Это говорит о том, что Safari и Chrome имеют такое же поведение, которое я проверил. Звучит , так как есть толчок для настройки спецификации, чтобы поведение вебкита до было ожидаемым поведением (согласно букве спецификации).
Обратите внимание, что я не использую событие «loadend», чтобы определить, когда браузер закончил отправку последнего байта. Я просто сравниваю «загруженное» значение с «общим» значением при обработке событий «прогресс» . Если эти два значения равны, я объявляю файл «полностью отправленным». Согласно спецификации, я должен был бы сделать это (я думаю), так как событие «loadend» просто запускается после последнего события «прогресс». См. Спецификацию относительно ProgressEvent для получения дополнительной информации о .
Подводя итог, это прекрасно работает в Chrome и Safari, но не в FireFox. Я не могу вспомнить, работает ли это в IE10 или нет. Я не могу вспомнить, так как я не очень много использую IE. В Firefox индикатор прогресса будет застревать, когда он достигнет около 99% или около того, пока не будет получен ответ.
Обратите внимание, что все это отслеживание прогресса возможно только в том случае, если пользовательский агент поддерживает API файлов. Это оставляет IE9 и старше.Для браузеров, не относящихся к файлу API, существует несколько вариантов:
- Установите какое-то соглашение, включающее запросы GET, которые понимают клиент и сервер. Клиент будет периодически отправлять запросы GET на сервер, и сервер должен будет реагировать на прогресс файла. FYI Fine Uploader имеет a scheduled feature request, чтобы посмотреть на это больше, хотя я не очень сумасшедший в этом подходе.
- Еще один вариант, который выглядит немного лучше, но, возможно, немного более ограниченным (поскольку он зависит от сервера приложений) заключается в использовании модуля UploadProgress в nginx (произносится как Engine-X, если вы не знакомы). Мне сказали, что у Apache есть аналогичный модуль, но я не смог найти какую-либо документацию для этого (хотя я вообще не рассматривал это вообще). У Fine Uploader также есть [запрос функции для этого (https://github.com/Widen/fine-uploader/issues/506), который я буду исследовать в ближайшем будущем.
Надеюсь, это ответит на ваши вопросы.
Ничего себе, отличный ответ и подробное объяснение! Большое спасибо! IE9 и ниже не заботятся обо мне, но Firefox - слишком плохо, что он тоже не работает. К сожалению, я не могу согласиться с вашим ответом, хотя мне бы очень хотелось. Похоже, мне придется реализовать какое-то серверное решение. Тем не менее, большое спасибо за ваш ответ! –
Мой ответ включает это как резерв. Что здесь отсутствует? –
Вы правы, но ответ arnaud упоминает технологию, непосредственно относящуюся к моей серверной среде (функция отслеживания загрузки PHP), которой у вас нет. Хотя после прочтения модуля Apache UploadProgress, который вы упомянули, я решил использовать его вместо этого. Итак, вот вы идите, ответьте на прием! –