2009-09-01 5 views
1

Je travaille sur une application HTML JScript/VBScript (afin que nous puissions exécuter à des privilèges plus élevés qu'une page Web normale) et nous fournissons la possibilité de télécharger un fichier et nous devons fournir des commentaires sur la progression du téléchargement à nos utilisateurs. Naturellement, j'ai figuré une barre de progression ou un texte de progression basé sur la taille totale du fichier et le montant du fichier déjà téléchargé. J'essaie d'obtenir la taille de la partie déjà téléchargée dans Internet Explorer. Jusqu'à présent, j'ai essayé tout ce que je peux penser pour accéder à quelle quantité du fichier est déjà téléchargé. Lorsque j'essaie d'accéder à responseText ou responseBody pendant readyState 3 (interactif), j'obtiens simplement l'exception:JScript/VBScript: Suivi du téléchargement du fichier via XMLHttpRequest

Les données nécessaires pour effectuer cette opération ne sont pas encore disponibles.

Il semble donc que Microsoft ne mentait pas quand ils ont établi que responseText ou responseBody ne seront pas disponibles jusqu'à ce que le XMLHttpRequest est terminée (allé à 4 readyState)

Je peux obtenir la taille totale du fichier et enregistrez le fichier sur disque, donc j'ai omis les parties du code que j'ai déjà. Voici ce que j'ai essayé. Je suis ouvert à toute autre suggestion - même en changeant les implémentations de XMLHttpRequest. Notez que je n'ai pas de contrôle sur le côté serveur des choses ... seulement mon application client, donc les solutions PHP/ASP ne fonctionneront pas. Merci à l'avance ...

function getRemoteFile(urlToFile){ 
    if (urlToFile) { 
    try   { 
     var xmlReq = new XMLHttpRequest(); 
     //Tried all of the following with no luck 
    //var xmlReq = new ActiveXObject('Microsoft.XMLHTTP'); 
    //var xmlReq = new ActiveXObject('Msxml2.DOMDocument.3.0'); 
    //var xmlReq = new ActiveXObject("Msxml2.XMLHTTP.3.0"); 
    //var xmlReq = new ActiveXObject("Msxml2.XMLHTTP.6.0"); 
    //var xmlReq =new ActiveXObject("Msxml2.DOMDocument.6.0"); 

     function updateDownloadProgress() {      
     if (xmlReq.readyState == 3) { 
      try { 
       alert(xmlReq.responseText.length); 

      } 
      catch (e) { 
      alert(e.message); 
      }   
      window.setTimeout(updateDownloadProgress, 200); 
     } 
     }      

     xmlReq.open("GET", urlToFile, true); 
     xmlReq.onreadystatechange = function(){ 
     if (xmlReq.readyState == 3)  { 
      updateDownloadProgress(); 
     } 
     if (xmlReq.readyState == 4)  { 
      alert("done"); 
     } 
     } 
     xmlReq.send(null); 
    } catch(e) { 
     alert(e.message); 
     return null; 
    } 
    } 
} 
+0

Si jamais Microsoft vous a donné cette fonctionnalité, cela fonctionnerait comme ceci http://xkcd.com/612/ :) –

Répondre

0

Ajouter un bloc try/catch lorsque vous vérifiez la progression du téléchargement. Assurez-vous de vider les données lorsque celles-ci sont disponibles sur le serveur, certains serveurs/scripts de serveur tamponneront le contenu.

+0

Je ne vois pas exactement comment cela va aider - même si les données sont vidées, sur un Téléchargement multi-MB vous n'avez généralement pas d'indicateurs de progression fiables pour le téléchargement. Peux-tu élaborer? Merci. –

0

Je ne pense pas que vous puissiez le faire simplement, car vous n'obtiendrez pas de mises à jour du côté client (du moins, pas d'une manière inter-navigateur) jusqu'à ce que tout ait été reçu. Cependant, vous pouvez indiquer sur le serveur quelle partie du fichier vous avez écrite dans la réponse. Une approche consiste donc à rendre le montant écrit dans la réponse pour une demande de téléchargement particulière disponible en parallèle via un deuxième appel AJAX. Ainsi, attribuez un ID à chaque téléchargement, stockez l'état de téléchargement trouvé sur le serveur par cet ID et appelez des requêtes AJAX parallèles et distinctes pour interroger la progression de cet ID. Ensuite, affichez-le comme vous voulez - barre de progression, étiquette indiquant le pourcentage d'achèvement, etc.

Voir this post pour une discussion des problèmes autour de readyState == 3.

1

Vous pouvez afficher la progression du téléchargement uniquement pour les documents XML dans IE, en utilisant l'événement OnDataAvailable:

var xmlDoc = new ActiveXObject("MSXML2.DOMDocument.3.0"); 
xmlDoc.ondataavailable = ondataavailable; 
xmlDoc.async = true; 
xmlDoc.load(url); 

function ondataavailable() { 
    ... 
} 

XML devient disponible avant d'être complètement chargé. Pour afficher la progression, vous devez placer le nombre de nœuds dans le premier nœud XML côté serveur et compter les nœuds lorsque de nouveaux éléments XML arrivent. Je sais que cela aide seulement avec des documents XML, et vous devez être en mesure de modifier votre serveur XML en ajoutant le nombre de nœuds. Mais c'est la seule façon d'afficher en quelque sorte des progrès dans IE, autant que je sache.

Notez que si le serveur renvoie un contenu non-xml, l'ondataavailable ne se déclenche jamais.

0

Mieux vaut tard que jamais ... ajouter une réponse ...

Aujourd'hui, j'ai trouvé en essayant que vous ne pouvez pas accéder au contenu de « Microsoft.XMLHTTP » - et plus probablement tous les autres dérivés XMLHTTP - jusqu'à ce qu'il est entièrement chargé.

Toutefois, vous pouvez accéder au contenu de 'InternetExplorer.application' en temps réel pendant le chargement. Mais je suppose que pour les développeurs web cet objet n'est pas aussi flexible.

Questions connexes