2009-07-02 10 views
25

Je dois écrire quelques rapports et demander à l'utilisateur de l'enregistrer sur sa machine locale. La dernière fois que j'ai fait cela, j'ai écrit un fichier sur le serveur Web, puis l'a envoyé au client via l'objet Response.C# Asp.net écrire le fichier au client

pour créer sur le serveur Web

TextWriter tw = new StreamWriter(filePath); 

envoyer au client

page.Response.WriteFile(path); 

La question est, est-il possible d'ignorer l'écriture du fichier physique au serveur Web et allez à droite de un objet qui représente le document à la réponse?

Répondre

25

Vous pouvez utiliser le Response.ContentType comme celui-ci

Response.ContentType = "text/plain"; 
Response.OutputStream.Write(buffer, 0, buffer.Length); 
Response.AddHeader("Content-Disposition", "attachment;filename=yourfile.txt"); 

Bien sûr, ne fonctionne que si vous voulez écrire un fichier texte. Dans le cas où vous voulez écrire un .doc par exemple, vous changez le ContentType en "application/msword" etc ...

+0

ce code écrit dans mon navigateur. Je n'ai pas d'invite. IReport rpt = new ContxReport(); rapport de chaînes = rpt.makeReport(); ASCIIEncoding encoding = new ASCIIEncoding(); byte [] encodedReport = encoding.GetBytes (rapport); Réponse.ContentType = "text/plain"; Response.OutputStream.Write (encodedReport, 0, encodedReport.Length); Response.AddHeader ("Content-Disposition", "inline; filename = shit.csv"); Response.End(); – jim

+1

En outre, vous devez définir tous les en-têtes avant d'écrire. – Talljoe

+1

Qu'est-ce que *** buffer ***? – Kiquenet

16

Vous pouvez.

Essayez ceci:

Table oTable = new Table(); 
//Add data to table. 

Response.Clear(); 
Response.Buffer = true; 
Response.ContentType = "application/vnd.ms-excel"; 
Response.AddHeader("Content-Disposition", "attachment;filename="test.xls""); 
Response.Charset = ""; 
this.EnableViewState = false; 
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(); 
System.Web.UI.Html32TextWriter oHtmlTextWriter = new System.Web.UI.Html32TextWriter(oStringWriter); 
0Table.RenderControl(oHtmlTextWriter); 
Response.Write(oStringWriter.ToString()); 
Response.End(); 

Cela donnera invite l'utilisateur à ouvrir ou enregistrer le fichier test.xls. De même, vous pouvez fournir d'autres objets ASP.NET à la place de Table.

+0

Vous devriez être en mesure d'utiliser Response.Output au lieu de créer un StringWriter. – Talljoe

+0

J'ai 2 questions. 1) Ce fichier sera-t-il capable de fonctionner? et 2) Une connexion multiple est-elle possible si vous utilisez un gestionnaire de téléchargement comme IDM, etc.? – shashwat

+2

@ShashwatTripathi Je ne suis pas sûr. C'était un morceau de code que j'ai utilisé depuis longtemps. À mon humble avis, il ne prend pas en charge la reprise ou plusieurs connexions de téléchargement. –

5

Oui.

page.Response.WriteFile(yourData, 0, yourData.Length); 
+0

J'ai 2 questions. 1) Ce fichier sera-t-il capable de fonctionner? et 2) Une connexion multiple est-elle possible si vous utilisez un gestionnaire de téléchargement comme IDM, etc.? – shashwat

5

dépend de la façon dont avez-vous organisé votre rapport La réponse exacte à la question (à savoir ce qui est « l'objet » vous faites référence). Si vous avez une seule chaîne, vous pouvez utiliser Response.Write pour l'écrire. Si vous avez besoin d'un TextWriter, Response.Output est ce que vous voulez - de cette façon, vous pouvez passer l'écriture sur le disque, puis en utilisant WriteFile. En outre, si votre contenu est binaire, vous pouvez utiliser Response.OutputStream pour cela.

Vous pouvez également définir Response.AddHeader ("Content-Disposition", "attachment") si vous souhaitez que l'utilisateur affiche une boîte de dialogue de sauvegarde. Toutefois, Content-Disposition n'est pas nécessairement respecté, de sorte que l'utilisateur peut toujours ouvrir le rapport directement dans le navigateur. N'oubliez pas de définir les en-têtes avant de sortir le contenu réel! En outre, en fonction du format du rapport, vous pouvez définir Response.ContentType sur quelque chose de approprié tel que text/plain, text/csv ou autre. Les types mime corrects sont répertoriés au the IANA site.

Questions connexes