2008-09-01 24 views
23

Quelle est la meilleure façon de mettre en œuvre, à partir d'une page web, une action de téléchargement en utilisant asp.net 2.0?Comment implémenter un téléchargement de fichier dans asp.net

Les fichiers journaux d'une action sont créés dans un répertoire appelé [Racine de l'application]/Journaux. J'ai le chemin complet et je veux fournir un bouton, que lorsque vous cliquez sur télécharger le fichier journal du serveur IIS au PC local des utilisateurs.

+0

Pourriez-vous utiliser Response.TransmitFile (pour un petit fichier également? –

Répondre

33

cette aide:

http://www.west-wind.com/weblog/posts/76293.aspx

Response.ContentType = "application/octet-stream"; 
Response.AppendHeader("Content-Disposition","attachment; filename=logfile.txt"); 
Response.TransmitFile(Server.MapPath("~/logfile.txt")); 
Response.End(); 

Response.TransmitFile est le moyen accepté d'envoyer des fichiers volumineux, au lieu de Response.WriteFile.

+7

Une partie clé de ceci est le Response.End() - sans elle vous finirez avec des téléchargements occasionnellement corrompus, des signatures numériques brisées, toutes sortes de bizarreries –

+0

Il ne fonctionne pas avec les fichiers PNG Comment dois-je faire? –

+0

Peut-il être utilisé ou modifié pour récupérer un fichier distant d'une autre URL? – AlexVPerl

10

http://forums.asp.net/p/1481083/3457332.aspx

string filename = @"Specify the file path in the server over here...."; 
FileInfo fileInfo = new FileInfo(filename); 

if (fileInfo.Exists) 
{ 
    Response.Clear(); 
    Response.AddHeader("Content-Disposition", "attachment; filename=" + fileInfo.Name); 
    Response.AddHeader("Content-Length", fileInfo.Length.ToString()); 
    Response.ContentType = "application/octet-stream"; 
    Response.Flush(); 
    Response.TransmitFile(fileInfo.FullName); 
    Response.End(); 
} 


Update:

Le code initial

Response.AddHeader("Content-Disposition", "inline;attachment; filename=" + fileInfo.Name); 

a "inline; fixation" à savoir deux valeurs de disposition de contenu.

Je ne sais pas exactement quand il a commencé, mais dans Firefox seulement le nom de fichier approprié n'apparaissait pas. La boîte de téléchargement de fichier apparaît avec le nom de la page Web et son extension (pagename.aspx). Après le téléchargement, si vous le renommez au nom réel; le fichier s'ouvre avec succès.

Selon this page, il fonctionne sur Premier arrivé, premier servi Servir. La modification de la valeur à attachment a seulement résolu le problème. PS: Je ne suis pas sûr que ce soit la meilleure pratique, mais le problème est résolu.

+2

-1: Comme Martin l'a dit, utilisez TransmitFile au lieu de WriteFile. cassé pour les fichiers volumineux – Niki

+0

+1 pour corriger la réponse! – bnieland

+0

Je le fais simplement avec un bouton à l'intérieur d'un ModalPopupExtender fonctionnant avec un panneau de mise à jour et ça ne marchera pas. cela fonctionne parfaitement? Des idées comment contourner cela? – JoeManiaci