2010-02-10 10 views
1

J'ai une application Web ASP.NET (en utilisant WebForms) et j'utilise Uploadify pour gérer le téléchargement de gros fichiers. Cela est fait en postant le fichier dans un HttpHandler.Barre de progression inexacte lors du téléchargement de fichiers volumineux à l'aide d'ASP.NET et de Uploadify?

Exemple de code (simplifié à des fins de démonstration):

$(".uploadify").uploadify({ 
    'uploader': '/uploadify/uploadify.swf', 
    'script': 'SaveUploadedFile.ashx', 
    'cancelImg': '/uploadify/cancel.png', 
    'queueID': 'fileQueue', 
    'auto': true, 
    'multi': false, 
    'method': 'post', 
    onSelect: function(e, queueId, file) { 
     alert(file.name + " selected"); 
    }, 
    onComplete: function(e, queueId, file, response, data) { 
     alert("complete: " + response); 
    }, 
    onCancel: function(e, queueId, file, data) { 
     alert("cancel"); 
    } 
}); 

Le HttpHandler qui reçoit le fichier est assez simple:

public void ProcessRequest(HttpContext context) 
{ 
    Debug.WriteLine("Save file"); 

    if (context.Request.Files.Count == 0) 
     throw new SystemException("No files uploaded"); 

    // Get the file 
    HttpPostedFile file = context.Request.Files.Get(0); 
    Debug.WriteLine("Got file: " + file.FileName + ", Length: " + file.ContentLength); 

    // Save it 
    string guid = Guid.NewGuid().ToString(); 
    string path = Path.Combine(Path.GetTempPath(), guid + ".tmp"); 
    file.SaveAs(path); 
    Debug.WriteLine("Saved to path: " + path); 

    // Update response and return guid 
    context.Response.StatusCode = 200; 
    context.Response.Write(guid); 

    Debug.WriteLine("All Done"); 
} 

Le problème est que la barre de progression affichée ne reflète réellement la progression du téléchargement et montre que le téléchargement est complet bien avant que le fichier ne soit réellement téléchargé. Par conséquent, l'interface utilisateur apparaît effectivement comme si elle ne faisait rien alors que la barre de progression reste à 100%, jusqu'à ce que le fichier soit complet.

Dans certains cas, le téléchargement échoue simplement après avoir atteint 100%, l'événement OnComplete ne se déclenche jamais, presque comme si la réponse du HttpHandler était perdue en cours de transfert, même si le fichier était enregistré. J'ai essayé à la fois Flajaxian et SWFUpload, et j'ai rencontré des problèmes similaires avec la barre de progression étant complètement désynchronisée avec la progression réelle du téléchargement, indiquant l'achèvement bien avant la fin du téléchargement. Ce problème n'apparaît pas lorsque vous testez en local ou avec de petits fichiers (généralement moins de quelques mégaoctets) car ils ont tendance à télécharger assez rapidement et le décalage entre le fichier téléchargé et la barre de progression est faible ou nul.

Existe-t-il un moyen d'utiliser une solution de téléchargement Flash (telle que Uploadify) avec une application Web ASP.NET et la barre de progression représente-t-elle mieux la progression réelle du téléchargement? Finalement, j'ai renoncé à essayer d'utiliser un téléchargeur basé sur le flash car il me semblait un peu trop compliqué, en particulier la barre de progression, qui ne représentait pas du tout la progression réelle du téléchargement. Remplacé cela avec Brettle NeatUpload à la place qui fonctionne beaucoup mieux.

+0

est le retard perçu en raison du traitement (dans ce cas, l'enregistrement d'une copie du fichier) une fois que le fichier a terminé le téléchargement sur votre serveur? Pour les téléchargements de fichiers volumineux, avez-vous augmenté les délais d'expiration de votre session dans votre fichier web.config? Une option est de passer à une barre de progression différente après 100%, comme la barre facebook vu ici http://www.ajaxload.info/ –

+0

@Todd - Les messages de débogage indiquent que la page n'est même pas atteinte jusqu'à ce que le téléchargement se termine , donc il ne semble pas que le problème est avec un traitement après le téléchargement. Les paramètres de délai d'attente de session et de taille maximale des demandes ont déjà été augmentés, mais ne semblent pas être liés à ce problème. – Mun

+0

Est-ce que quelque chose provoque le recyclage du pool d'applications? –

Répondre

2

Cela peut être un problème avec votre logiciel anti-virus (en particulier AVG) et son proxy de téléchargement ou pare-feu. Voici une question connexe:

Every flash uploader giving bad progress values

+0

Merci, ce post a l'air très intéressant et décrit exactement mon problème. Incidemment, j'utilise AVG sur mon ordinateur de bureau. Je vais essayer de tester cela sur une machine différente sans AVG et voir si cela fait une différence. – Mun

+0

Après quelques tests, il semble que le problème était en fait AVG. Merci.La barre de progression de Uploadify est encore un peu peu fiable quand on travaille avec un proxy, probablement pour la même raison, donc on va s'en tenir à NeatUpload dans ce cas, mais c'est bien de trouver enfin la cause de ce comportement étrange. – Mun