2009-07-02 10 views
25

Devo scrivere alcuni rapporti e chiedere all'utente di salvarlo sul suo computer locale. L'ultima volta che l'ho fatto ho scritto un file sul server web e l'ho inviato al client tramite l'oggetto Response.C# Asp.net scrive il file sul client

per creare sul server web

TextWriter tw = new StreamWriter(filePath); 

da inviare al cliente

page.Response.WriteFile(path); 

La domanda è: C'è un modo per saltare la scrittura del file fisico al server web e andare a destra da un oggetto che rappresenta il documento per la risposta?

risposta

25

è possibile utilizzare il Response.ContentType come questo

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

Questo ovviamente funziona se si vuole scrivere un file di testo. Ad esempio, se si desidera scrivere un file .doc, modificare ContentType in "application/msword", ecc ...

+0

questo codice scrive scrivi al mio browser. Non ho richieste. IReport rpt = new ContxReport(); string report = rpt.makeReport(); Codifica ASCIIEncoding = new ASCIIEncoding(); byte [] encodedReport = encoding.GetBytes (report); Risposta.ContentType = "text/plain"; Response.OutputStream.Write (encodedReport, 0, encodedReport.Length); Response.AddHeader ("Content-Disposition", "inline; filename = shit.csv"); Response.End(); – jim

+1

Inoltre, è necessario impostare tutte le intestazioni prima di scrivere. – Talljoe

+1

Che cos'è *** buffer ***? Il buffer – Kiquenet

16

È possibile.

Prova questo:

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(); 

Questo darà richiedere all'utente di aprire o salvare il file test.xls. allo stesso modo è possibile fornire altri oggetti ASP.NET al posto di Tabella.

+0

Dovresti essere in grado di utilizzare Response.Output invece di creare StringWriter. – Talljoe

+0

Ho 2 domande. 1) Il file resume in grado? e 2) Sono possibili connessioni multiple se si utilizza un gestore di download come IDM, ecc.? – shashwat

+2

@ShashwatTripathi Non sono sicuro. Questo era un pezzo di codice che usavo da molto tempo. IMHO, non supporterà resume o più connessioni di download. –

5

Sì.

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

Ho 2 domande. 1) Il file resume in grado? e 2) Sono possibili connessioni multiple se si utilizza un gestore di download come IDM, ecc.? – shashwat

5

La risposta esatta alla domanda dipende da come si fa a avere il vostro rapporto organizzata (vale a dire quello che è il "oggetto" si sta riferendo). Se si dispone di una singola stringa, è possibile utilizzare Response.Write per scriverlo. Se hai bisogno di un TextWriter, Response.Output è quello che vuoi - in questo modo puoi saltare la scrittura sul disco e poi usare WriteFile. Inoltre, se il tuo contenuto dovesse essere binario, potresti usare Response.OutputStream per quello.

È anche possibile impostare Response.AddHeader ("Content-Disposition", "attachment"), se si desidera che l'utente visualizzi una finestra di dialogo di salvataggio. Tuttavia, Content-Disposition non è necessariamente rispettato, quindi l'utente può comunque aprire il report direttamente nel browser. Ricorda di impostare le intestazioni prima di pubblicare il contenuto reale!

Inoltre, a seconda del formato del report, è possibile impostare Response.ContentType su qualcosa di appropriato come text/plain, text/csv o qualsiasi altra cosa. I tipi di mime corretti sono elencati allo the IANA site.

Problemi correlati