2009-05-16 6 views
18

Je dois forcer le lancement du téléchargement d'un fichier .sql, lorsque l'utilisateur clique sur un bouton dans mon application Web ASP .NET (C#).Force le téléchargement d'un fichier sur le serveur Web - ASP .NET C#

Comme dans, lorsque le bouton est cliqué, une boîte de dialogue Enregistrer devrait ouvrir à la fin du client ...

Comment puis-je faire?

EDIT

Ceci est le code que je utilise

 string sql = ""; 
     using (System.IO.StreamReader rdr = System.IO.File.OpenText(fileName)) 
     { 
      sql = rdr.ReadToEnd(); 
     } 
     Response.ContentType = "text/plain"; 
     Response.AddHeader("Content-Disposition", "attachment; filename=Backup.sql"); 
     Response.Write(sql); 
     Response.End(); 

C'est l'erreur que je reçois ...

alt text http://img40.imageshack.us/img40/2103/erroro.gif

Qu'est-ce qui ne va pas?

+0

Vous ne devrais pas faire ça comme ça dans le cas de clic de bouton. Utilisez Response.Redirect ou d'autres méthodes pour rediriger l'utilisateur vers une autre page dans un événement de clic sur un bouton. Voir les instructions dans ma réponse. –

Répondre

29

Créer un gestionnaire HTTP séparé (DownloadSqlFile.ashx):

<%@ WebHandler Language="C#" Class="DownloadHandler" %> 

using System; 
using System.Web; 

public class DownloadHandler : IHttpHandler { 
    public void ProcessRequest(HttpContext context) { 
     var fileName = "myfile.sql"; 
     var r = context.Response; 
     r.AddHeader("Content-Disposition", "attachment; filename=" + fileName); 
     r.ContentType = "text/plain"; 
     r.WriteFile(context.Server.MapPath(fileName)); 
    } 
    public bool IsReusable { get { return false; } } 
} 

Puis faire la crosse sur votre page ASP.NET accédez à DownloadSqlFile.ashx.

+0

C'est mieux que ma réponse en termes de modèles de conception. –

+5

Cela suppose que le fichier que vous voulez télécharger est un fichier statique. –

+0

@TimJarvis Dans ce cas, ce ne serait pas du tout un fichier. Ce serait juste un flux que vous pouvez sortir avec '.BinaryWrite()'. N'oubliez pas de 'flush()' – tfrascaroli

18

Vous devez indiquer au navigateur que ce que vous envoyez n'est pas html et ne devrait pas être affiché comme tel dans le navigateur. Le code suivant peut être utilisé pour retourner un texte dans votre code côté serveur et il présentera la boîte de dialogue pour l'utilisateur que vous vouliez:

Response.Clear(); //eliminates issues where some response has already been sent 
Response.ContentType = "text/plain"; 
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.sql", filename)); 
Response.Write(yourSQL); 
Response.End(); 

filename: le nom que vous souhaitez donner

yourSQL: le contenu du fichier sql

+0

en obtenant une erreur en faisant cela. ajouté une capture d'écran dans le message de la question. – Sameet

+0

Je copie ce code sur une page que j'utilise qui télécharge des données de .csv ainsi je sais que cela fonctionne. Je l'appelle dans l'événement page_load, peut-être votre page a déjà commencé à renvoyer des données au client? –

+0

Mon code est dans l'événement button_click ... pourquoi doit-il être dans page_laod()? J'ai besoin du téléchargement pour démarrer sur un événement de clic de bouton ... – Sameet

1

Ajoutez un Response.Clear avant de Response.Write pour corriger l'erreur, si elle est correctement indiquée dans la boîte de dialogue Chrome.

donc à intégrer dans l'extrait dans d'autres réponses ...

//add this 
Reponse.Clear(); 

//from other answer 
Response.ContentType = "text/plain"; 
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.sql", filename)); 
Response.Write(yourSQL); 
Response.End; 
5

Le problème est que vous utilisez le code sur la même page que est actuellement chargé dans le navigateur. Vous tentez de modifier le flux de réponse et la disposition de la page chargée actuelle. Au lieu de cela, créez un HttpHandler distinct, comme suggéré par Mehrdad. Ensuite, en cliquant sur le bouton, vous invoquerez l'URL du gestionnaire. Le bouton pourrait même être un simple lien hypertexte dont l'URL source est le suivant:

<a href="DownloadSqlFile.ashx">Download SQL</a> 

Avez-vous un sens? Le point étant, vous ne pouvez pas modifier la réponse de la page déjà chargée. Lancer une nouvelle demande en utilisant un gestionnaire pour faire le travail.

0

La solution fonctionne ci-dessous pour moi

string fileNameAndExtension = "thisFile.pdf";  
string fullPath = "../folder/files/" + fileNameAndExtension;  
Response.Clear(); 
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileNameAndExtension); 
Response.TransmitFile(fullPath); 
Response.End(); 
Questions connexes