Tengo el siguiente código AJAX, el script sube el archivo al servidor correctamente (nodo express). El problema al que me enfrento es que onProgress se activa solo cuando se descarga el byte total (es decir, al final de la carga del archivo) y no durante su progreso.
Actualmente no puedo mostrar en el cliente alguna interfaz de usuario para la progresión de la carga de archivos.
Me gustaría saber si este problema está relacionado con la llamada AJAX o podría estar relacionado con el servidor.
var formData = new FormData(); var xhr = new XMLHttpRequest(); var onProgress = function (e) { if (e.lengthComputable) { var percentComplete = (e.loaded / e.total) * 100; console.log(percentComplete); } }; var onLoad = function (event) { var reponse = JSON.parse(xhr.responseText); this._logicAddWdg(reponse); }.bind(this); var onError = function (err) { console.log(onError); }; formData.append('file', this._uploaderFile); xhr.addEventListener('error', onError, false); xhr.addEventListener('progress', onProgress, false); xhr.addEventListener('load', onLoad, false); xhr.open('post', '/uploads', true); xhr.send(formData);Respuesta de los encabezados del servidor:
Accept-Ranges:bytes Cache-Control:public, max-age=0 Connection:keep-alive Content-Length:5510872 Content-Range:bytes 0-5510871/5510872 Content-Type:video/mp4 Date:Tue, 11 Apr 2017 12:02:20 GMT ETag:W/"5416d8-15b5ce4a545" Last-Modified:Tue, 11 Apr 2017 12:02:20 GMT X-Powered-By:Express Request Headers view source Accept:*/* Accept-Encoding:identity;q=1, *;q=0 Accept-Language:en-US,en;q=0.8 Cache-Control:no-cache Connection:keep-alive Host:localhost:8080 Pragma:no-cache Range:bytes=0-Adjunte su controlador de eventos de carga a XMLHttpRequest.upload .
xhr.upload.addEventListener('progress', onProgress, false); xhr.upload maneja los eventos de los datos cargados. Lo que tenía antes manejaba el progreso de la descarga de la respuesta.
Todos los demás controladores deben permanecer igual.
¿Lo estás probando en línea o en tu máquina? Si está probando este código localmente y está cargando un archivo bastante pequeño (parece que está cargando un archivo de video de ~5 MB), no puede ver ningún progreso porque el tiempo que llevará cargarlo es proporcional a un simple operación de copiar/pegar realizada en su sistema.
Intente cargar un archivo más grande o pruébelo en línea, su código parece correcto.