XMLHttpRequest в google-chrome не сообщает о событиях прогресса
Привет всем, у меня есть этот код:
function test()
{
req = new XMLHttpRequest();
req.upload.addEventListener("progress", updateProgress, false);
req.addEventListener("readystatechange", updateProgress, false);
req.addEventListener("error", uploadFailed, false);
req.addEventListener("abort", uploadCanceled, false);
var data = generateRandomData(currentPayloadId);
totalSize = data.length;
req.open("POST", "www.mydomain.com/upload.aspx");
start = (new Date()).getTime();
req.send(data);
}
function updateProgress(evt)
{
if (evt.lengthComputable) {
total = totalSize = evt.total;
loaded = evt.loaded;
}
else {
total = loaded = totalSize;
}
}
Кроме того, мой сервер отвечает на первоначальный запрос OPTIONS для upload.aspx с 200 и Access-Control-Allow-Origin: *
и затем выполняется второй запрос POST
Все кажется на месте, и он отлично работает на FireFox, но на G Chrome обработчик updateProgress не вызывается, а только один раз, а затем lengthComputable является ложным.
Мне нужен Access-Control-Allow-Origin: *, потому что это междоменный вызов, родитель script - это ресурс на другом сервере, а затем домен upload.aspx
Кто-нибудь может дать мне подсказки, подсказки, подскажите пожалуйста? это известная проблема с G Chrome?
Спасибо!
Яйцеклетки
Ответы
Ответ 1
Сначала убедитесь, что "www.example.com"
добавлен в manifest.json
, например:
manifest.json
{
..
"permissions": [
"http://www.example.com/",
"https://www.example.com/",
],
..
}
Тогда я думаю, что ваш пример должен работать.
Дополнительные сведения об использовании xhr в расширениях google chrome приведены здесь.
Также документы CSP стоит взглянуть на то, что не указано выше.
Ответ 2
Это может быть просто проблема совместимости с свойством XMLHttpRequest.upload. Он возвращает объект XMLHttpRequestUpload, но если вы попытаетесь найти эту спецификацию объекта в MDN, ее не существует, и как мы узнаем, какие браузеры ее полностью поддерживают.
Совместимость XMLHttpRequest.upload
![Совместимость для свойства XMLHttpRequest.upload]()
Пробовали ли вы прослушивание прогресса непосредственно на xhr:
req.addEventListener("progress", updateProgress, false);
Ответ 3
Я использую jQuery для такого прогресса:
$.ajax({
url : furl,
type : method,
data : data,
//...
},
xhr : function () {
//upload Progress
var xhr = $.ajaxSettings.xhr();
if (xhr.upload) {
xhr.upload.addEventListener('progress', function (event) {
var percent = 0;
var position = event.loaded || event.position;
var total = event.total;
if (event.lengthComputable) {
percent = Math.ceil(position / total * 100);
}
//update progressbar
$(".progress-bar").css("width", + percent + "%");
$(" .status").text(position + " / " + total + " (" + percent + "%)");
}, true);
}
return xhr;
},
Ответ 4
Я думаю, что у меня есть решение для вашей проблемы
Я не знаю, что стоит за этой функцией "generateRandomData()"
var data = generateRandomData(currentPayloadId)
Он работает, когда я меняю на это:
var data = new FormData();
data.append("fileToUpload", document.getElementById('fileToUpload').files[0]);
Небольшое объяснение: вам нужно вручную добавить к форме данные форму ввода файла, где fileToUpload
есть <input type="file" name="fileToUpload" id="fileToUpload" />
И в вашей функции updateProgress
в разделе IF
вы можете добавить что-то подобное для отслеживания прогресса console.log(evt.total +" - "+ evt.loaded)
![введите описание изображения здесь]()
Это работает в браузере Google Chrome. Я тестировал новую версию браузера 57
4 года назад я сделал для себя формат выполнения загрузки, а это значит, что этот код работает и в старой версии браузера.
Весь фрагмент кода будет выглядеть следующим образом:
function test()
{
req = new XMLHttpRequest();
req.upload.addEventListener("progress", updateProgress, false);
req.addEventListener("readystatechange", updateProgress, false);
req.addEventListener("error", uploadFailed, false);
req.addEventListener("abort", uploadCanceled, false);
//var data = generateRandomData(currentPayloadId);
var data = new FormData();
data.append("fileToUpload", document.getElementById('fileToUpload').files[0]);
totalSize = data.length;
req.open("POST", "www.mydomain.com/upload.aspx");
start = (new Date()).getTime();
req.send(data);
}
function updateProgress(evt)
{
if (evt.lengthComputable) {
total = totalSize = evt.total;
loaded = evt.loaded;
console.log(evt.total +" - "+ evt.loaded)
}
else {
total = loaded = totalSize;
}
}
Ответ 5
У меня была эта проблема, когда страница, которую вы загружаете, не содержит
Content-Length: 12345
в заголовке, где 12345 - длина ответа в байтах. Без параметра длины функция прогресса не имеет никакого отношения к работе.