¿Es posible obtener el progreso de una XMLHttpRequest (bytes cargados, bytes descargados)?
Esto sería útil para mostrar una barra de progreso cuando el usuario está cargando un archivo grande. La API estándar no parece admitirlo, pero ¿tal vez hay alguna extensión no estándar en alguno de los navegadores? Parece una característica bastante obvia después de todo, ya que el cliente sabe cuántos bytes se cargaron / descargaron.
nota: Soy consciente de la alternativa "sondear el progreso del servidor" (es lo que estoy haciendo ahora). El principal problema con esto (que no sea el complicado código del lado del servidor) es que, por lo general, al cargar un archivo grande, la conexión del usuario está completamente retenida, porque la mayoría de los ISP ofrecen un flujo ascendente deficiente. Entonces, hacer solicitudes adicionales no responde tan bien como esperaba. Esperaba que hubiera una forma (tal vez no estándar) de obtener esta información, que el navegador tiene en todo momento.
fuente
Firefox admite eventos de progreso de descarga XHR .
fuente
Uno de los enfoques más prometedores parece ser abrir un segundo canal de comunicación de regreso al servidor para preguntarle cuánto se ha completado la transferencia.
fuente
Firefox 3.5 admitirá el evento de progreso de carga
fuente
Para el total cargado, no parece haber una forma de manejar eso, pero hay algo similar a lo que desea descargar. Una vez que readyState es 3, puede consultar periódicamente responseText para obtener todo el contenido descargado hasta una Cadena (esto no funciona en IE), hasta que todo esté disponible, momento en el que pasará a readyState 4. El total Los bytes descargados en un momento dado serán iguales al total de bytes en la cadena almacenada en responseText.
Para un enfoque de todo o nada a la pregunta de carga, ya que debe pasar una cadena para cargar (y es posible determinar los bytes totales de eso), el total de bytes enviados para readyState 0 y 1 será 0, y el total para readyState 2 serán el total de bytes en la cadena que ingresó. El total de bytes enviados y recibidos en readyState 3 y 4 será la suma de los bytes en la cadena original más el total de bytes en responseText.
fuente
fuente
Si tiene acceso a su instalación de apache y confía en el código de terceros, puede usar el módulo de progreso de carga de apache (si usa apache; también hay un módulo de progreso de carga nginx ).
De lo contrario, tendría que escribir una secuencia de comandos que pueda golpear fuera de banda para solicitar el estado del archivo (por ejemplo, verificando el tamaño del archivo tmp).
Creo que se está trabajando en Firefox 3 para agregar soporte de progreso de carga al navegador, pero eso no entrará en todos los navegadores y será ampliamente adoptado por un tiempo (es una pena).
fuente
La única forma de hacerlo con JavaScript puro es implementar algún tipo de mecanismo de sondeo. Deberá enviar solicitudes ajax a intervalos fijos (cada 5 segundos, por ejemplo) para obtener la cantidad de bytes recibidos por el servidor.
Una forma más eficiente sería usar flash. El componente flexible FileReference distribuye periódicamente un evento de 'progreso' que contiene el número de bytes ya cargados. Si necesita seguir con JavaScript, hay puentes disponibles entre actionscript y javascript. La buena noticia es que este trabajo ya está hecho para ti :)
swfupload
Esta biblioteca permite registrar un controlador javascript en el evento de progreso flash.
Esta solución tiene la gran ventaja de no requerir recursos adicionales en el lado del servidor.
fuente