2009-12-03 15 views
3

J'ai le code suivant fournissant un fichier aux utilisateurs lorsqu'ils cliquent sur un lien de téléchargement. Pour des raisons de sécurité, je ne peux pas simplement créer un lien direct vers le fichier, donc cela a été configuré pour décoder l'URL et transmettre le fichier.Response TransmitFile

Cela a fonctionné correctement pendant un certain temps mais récemment j'ai commencé à avoir des problèmes où le fichier commencera à télécharger mais il n'y a aucune indication de la taille du fichier. À cause de cela, lorsque le téléchargement devrait s'arrêter, ce n'est pas le cas.

Le fichier fait environ 99mb mais lorsque je le télécharge, le navigateur continue de télécharger bien au-delà de 100mb. Je ne sais pas ce qu'il télécharge mais si je ne l'annule pas, ça ne s'arrête pas. Donc, ma question est, existe-t-il une alternative à TransmitFile ou un moyen de s'assurer que la taille du fichier est également envoyée pour qu'elle s'arrête au bon moment?

Voici le code:

string filename = Path.GetFileName(url); 
context.Response.Buffer = true; 
context.Response.Charset = ""; 
context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
context.Response.ContentType = "application/x-rar-compressed"; 
context.Response.AddHeader("content-disposition", "attachment;filename=" + filename); 
context.Response.TransmitFile(context.Server.MapPath(url)); 
context.Response.Flush(); 

Je ne veux pas utiliser WriteFile parce que je ne veux pas charger le fichier en mémoire car il est si grand.

Merci.

+0

Désolé, j'ai oublié de poster mon code. string filename = Path.GetFileName (url); context.Response.Buffer = true; context.Response.Charset = ""; context.Response.Cache.SetCacheability (HttpCacheability.NoCache); context.Response.ContentType = "application/x-rar-compressed"; context.Response.AddHeader ("content-disposition", "pièce jointe; nomfichier =" + nomfichier); context.Response.TransmitFile (context.Server.MapPath (url)); context.Response.Flush(); – geoff

+0

J'ai trouvé du code que j'espérais aider, mais ce n'est pas le cas. FileInfo OutFile = nouveau FileInfo (context.Server.MapPath (url)); context.Response.Clear(); chaîne filename = Path.GetFileName (url); context.Response.Buffer = true; context.Response.Charset = ""; context.Response.Cache.SetCacheability (HttpCacheability.NoCache); context.Response.ContentType = "application/x-rar-compressed"; context.Response.AddHeader ("content-disposition", "pièce jointe; nomfichier =" + nomfichier); context.Response.TransmitFile (context.Server.MapPath (url), 0, OutFile.Length); context.Response.Flush(); – geoff

Répondre

2

Je pense avoir trouvé la réponse.

J'ai ajouté le code suivant et maintenant, au moins pour moi, il signale la bonne taille de fichier et fonctionne comme prévu.

FileInfo OutFile = new FileInfo(context.Server.MapPath(url)); 
long filesize = OutFile.Length; 
.... 
context.Response.AddHeader("Content-Length", filesize.ToString());