2010-12-10 71 views
3

XMLHttpRequest 2 a une nouvelle chose. Il peut télécharger des fichiers. J'ai eu ce travail (c'est super facile). Maintenant, je me demande s'il existe un moyen d'obtenir la progression du téléchargement de ce fichier. Cela ne m'intéresse pas normalement, mais dans Google Chrome (8), j'ai vu que l'événement onreadystatechange est un XMLHttpRequestProgressEvent. Progrès ... Il n'y a rien là-dedans de progrès de téléchargement (juste demande l'état), mais cela m'a fait me demander.Télécharger la progression (avec ou sans XMLHttpRequest 2) avec Javascript

Google Chrome a un «compteur» de progression lors du téléchargement natif de gros fichiers. C'est standard. Il est toujours là et non configurable. C'est dans la barre d'état. Est-ce que quelque chose comme ça est possible avec Javascript? Je voudrais le mettre dans un bel élément <progress> ou quelque chose.

Je ne veux pas d'uploaders SWF ou Java (avec polling et> callbacks JS). Ça doit être natif. Si le navigateur peut le faire, Javascript devrait être capable de le faire, n'est-ce pas? =)

Dans le cas de non XMLHttpRequest 2, je suppose que ce ne serait pas possible avec le téléchargement de fichiers très standard (pas d'ajax et juste un <input type=file>).

Merci pour l'information

Répondre

9

Accrocher l'événement progress. Cela vous donnera des progrès pour toutes les demandes. Vérifiez d'abord si l'objet de téléchargement est disponible - cela vous permettra de progresser uniquement pour la partie de téléchargement.

Quelque chose comme ceci:

var xhr; // this is your XMLHttpRequest 

// hook to upload events if available, otherwise snag all progress events 
var eventSource = xhr.upload || xhr; 

eventSource.addEventListener("progress", function(e) { 
    // normalize position attributes across XMLHttpRequest versions and browsers 
    var position = e.position || e.loaded; 
    var total = e.totalSize || e.total; 

    // TODO: display progress 
}); 
+0

xhr.upload et XHR ont tous deux événements progress? Quelle est la différence? La seule fonction de XHR est de télécharger, non? – Rudie

+0

xhr.onprogress ne se déclenche que sur la réponse du serveur de début/de fin. xhr.upload.onprogress se déclenche de temps en temps jusqu'à ce que le téléchargement soit terminé. Est-ce un comportement attendu et fonctionnel? – Rudie

+2

Ce n'est pas très clair, et diffère en fonction du navigateur et de la version de XMLHttpRequest que vous utilisez. Fondamentalement, xhr.onprogress se déclenche pour les téléchargements et les téléchargements. xhr.upload.onprogress se déclenche uniquement pour les téléchargements. xhr.upload est implémenté uniquement dans XMLHttpRequest version 2. En ajoutant xhr.upload.onprogress s'il est disponible, ou bien xhr.onprogress, vous obtenez la progression du téléchargement quelle que soit la version que vous utilisez. Vous obtiendrez également des progrès sur la réponse si vous connectez xhr.onprogress (c'est-à-dire XMLHttpRequest v1). –