2012-01-22 3 views
2

J'ai construit un uploader pour mon application mais je me bats sur quelque chose.Ajax/iFrame/FileSystemObject Télécharger

Toutes les 3 secondes, mon script AJAX appelle la page ASP, checkProgress.asp, pour vérifier combien de fichiers se trouvent dans ce dossier pendant le téléchargement, il vérifie également si un fichier txt appelé complete.txt s'y trouve. Une fois le décompte terminé, il envoie une réponse au script AJAX avec quelque chose comme "File 2 uploaded ..." et 3 secondes plus tard il envoie "File 3 uploaded ...", et ainsi de suite. Si le fichier complete.txt a été trouvé, il retournera "Complete" au lieu de compter. Cela a bien fonctionné, une fois, et ensuite ne semblait pas fonctionner correctement après cela. Je reçois le message "complet" comme je devrais, mais je n'obtiens pas la réponse de progression du compte de fichiers. J'ai couru la page checkProgress manuellement avec une nouvelle fenêtre de navigateur pour voir pourquoi mon panneau de progression ne se mettait pas à jour avec la progression, et j'ai remarqué que l'icône de chargement du navigateur tournait juste, et quand le téléchargement terminé, . L'appel AJAX n'atteignait donc pas la page pour rassembler le nombre de fichiers car il était occupé, ce qui m'embrouille, car tout ce que fait cette page est de compter le nombre de fichiers dans un dossier. Est-ce que quelqu'un peut suggérer ce que je fais mal? Est-ce que cela ne va tout simplement pas se produire pendant l'ajout de ce dossier?

Voici mon script AJAX. Cela commence lorsque le téléchargement commence:

var upload1ProgressCheckInt = setInterval(function() { 
    var postData = "token="+token; 
    $.ajaxSetup ({ cache: false }); 

    $.ajax({ type : 'GET', url : 'ajax/checkProgress.asp', 
    dataType : 'html', data : postData, 
    success : function(data) { 
     if (data == "Failed") { 
      $('#upload1ProgressStatus').html('Error: Upload cancelled!'); 
      clearInterval(upload1ProgressCheckInt); 
      // do stuff 
     } else if (data == "Complete") { 
      $('#upload1ProgressStatus').html('Success: Files uploaded'); 
      clearInterval(upload1ProgressCheckInt); 
      // do stuff 
     } else { 
      $('#upload1ProgressStatus').html(data); 
     } 
    } 
    }); // end ajax 
}, 3000); 

et cette page checkProgress.asp:

Set FSO = Server.CreateObject("Scripting.FileSystemObject") 
If (FSO.FileExists(Server.MapPath("../files/photos/"&token_&"/complete.txt"))) = True Then 
    Response.Write "Complete" 
Else 
    Set folder = FSO.GetFolder(Server.MapPath("../files/photos/"&token_&"/")) 
    Set files = folder.Files 
    fileCounter = files.Count 
    Response.Write "File "&fileCounter&" uploaded..." 
End If 
+0

Cela ressemble à un problème de threading. Est-ce que vous stockez quelque chose dans l'objet Session? Si c'est le cas, essayez de vous débarrasser de ce code et de voir si le thread de travail est toujours bloqué. –

+0

@Ilia G - oui, j'ai des informations de connexion stockées dans les variables de session. Je viens de le remarquer, tout mon site ne fonctionnera pas tant que le téléchargement ne sera pas terminé – TheCarver

+0

En fait, pas tout mon site, juste la partie où je suis connecté par sessions – TheCarver

Répondre

1

... continue des commentaires.

Alors voici comment je le comprends. L'ASP classique affecte un thread de travail à chaque session, car les objets ASP classiques sont à un seul thread, et donc la seule façon de les partager (stockée dans l'objet Session) entre les requêtes est d'avoir un seul thread pour chaque session. Naturellement, cela signifie exactement ce que vous voyez - toutes les autres demandes sont bloquées jusqu'à la fin du téléchargement.

Manière de contourner ce problème serait de sortir de la session. Malheureusement, le cookie de session est uniquement HTTP (pour des raisons de sécurité), donc je ne pense pas qu'il existe un moyen de le supprimer de la requête AJAX.

Vous pouvez rendre votre entrée IIS répondre à un autre nom d'hôte et convertir votre requête AJAX en demande JSONP à ce second nom d'hôte. Je ne suis pas sûr s'il y a une manière plus gracieuse de le faire.

==================

EDIT: En fait, je Reprenez la partie sur les cookies. Sûrement vous pouvez les tuer en donnant headers:{Cookie:""} à votre appel ajax()? Il vaut la peine d'essayer ....

+0

Intéressant, merci pour vos efforts. Sortir de la session pourrait être possible. Je vais jouer rapidement avec ça, peut me donner une meilleure compréhension. Retour sous peu – TheCarver

+0

Vous êtes une star, merci beaucoup! J'ai abandonné la session (Session.Abandon) juste avant le lancement du script de téléchargement, et hop, nous avons des indications de progrès. Mais maintenant, je dois travailler pour recréer la session lorsque le téléchargement est terminé .. – TheCarver

+0

@MartinG Comme je l'ai dit, je pense que vous pouvez vous en sortir en réglant simplement l'entête 'Cookie' sur votre requête ajax pour la chaîne vide ... parce que Si cela fonctionne, ce serait plus facile que d'abandonner la session. –

Questions connexes