15

Hola a todos tengo este código:XMLHttpRequest en Google-Chrome no está reportando eventos de progreso

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; 
    } 
} 

Además, mi servidor responde a la solicitud OPCIONES inicial para upload.aspx con 200 y el Access-Control-Permita -Origin: * y luego aparece la segunda solicitud POST

Todo parece funcionar y funciona muy bien en FireFox, pero en G Chrome no se llama al controlador updateProgress pero solo una vez y luego el lengthComputable es falso.

necesitaba el-Allow-Access-Control Origen: * porque se trata de una llamada de dominios cruzados, el padre de la escritura es un recurso en un servidor diferente, entonces el dominio upload.aspx

Alguien me puede dar alguna pistas, consejos, ayuda por favor? ¿Es este un problema conocido con G Chrome?

¡Gracias! Ova

+1

¿Funciona cuando no es CORS? Si lo hace, genere un error en http://crbug.com/new – Kinlan

+0

para las personas que buscan a su alrededor, el cuerpo eval de 'func updateProgress' puede omitirse por completo si el evento de progreso xhr ha establecido' evt.lengthComputable' en falso. No estoy muy seguro de lo que determina este comportamiento, pero parece suceder con pequeños intercambios de un solo fragmento en las solicitudes. Puede verificar fácilmente {en la misma función} finalización (solo) marcando las propiedades 'position' y' loaded' de los manejadores de eventos. (Por cierto, esta sintaxis no es (muy probablemente) compatible con las iteraciones más recientes de jquery.) –

+1

Dado que está utilizando una URL absoluta, ¿no debería comenzar con: "http: //"? –

Respuesta

0

Esto podría ser simplemente un problema de compatibilidad con la propiedad XMLHttpRequest.upload. Devuelve un objeto XMLHttpRequestUpload, pero si intenta encontrar esa especificación de objeto en MDN, no existe, entonces, ¿cómo sabemos qué navegadores lo soportan completamente?

XMLHttpRequest.cargar Compatibilidad Compatability for the XMLHttpRequest.upload property

has necesitado escuchar para el progreso directamente en la xhr:

req.addEventListener("progress", updateProgress, false); 
0

utilizo jQuery para el progreso de esa manera:

$.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; 
     }, 
0

creo que tengo una solución para su problema
No sé qué hay detrás de esta función "generateRandomData()"

var data = generateRandomData(currentPayloadId) 

Se está trabajando cuando cambio en esto:

var data = new FormData(); 
data.append("fileToUpload", document.getElementById('fileToUpload').files[0]); 

pequeña explicación: Es necesario manualmente para anexar al formulario de datos de un formulario de entrada de archivos, donde fileToUpload es <input type="file" name="fileToUpload" id="fileToUpload" />
Y en su función updateProgress en IF parte que se puede añadir algo como esto para seguir el progreso console.log(evt.total +" - "+ evt.loaded)
enter image description here

esto es trabajar en Google Chrome navegador. He probado en la nueva versión del navegador 57
Me hice un formulario de progreso de carga hace 4 años, lo que significa que este código también funciona en la versión anterior del navegador.

Todo un fragmento de código se busca como esto

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; 
    } 
} 
0

he tenido este problema cuando la página de su están cargando no contiene un

Content-Length: 12345 

en la cabecera, donde 12345 es el duración de la respuesta en bytes. Sin un parámetro de longitud, la función de progreso no tiene nada en qué trabajar.

Cuestiones relacionadas