2009-05-22 9 views
5

Vorrei creare un file di testo per l'esportazione/download, come un * .csv, da un'applicazione ASP.NET. So di Response.TransmitFile, ma voglio farlo senza creare e salvare fisicamente un file sul server. È possibile? Qualcuno ha fatto qualcosa del genere?In ASP.NET, come ottenere il browser per scaricare il contenuto di stringhe in un file? (C#)

+0

potresti essere un po 'più specifico? Vuoi dire che vuoi prendere una stringa e salvarla su un file sul client e non creare mai un file sul server? –

risposta

1

Un file non ancora salvato è solo una variabile stringa o un MemoryStream. Ma per grandi quantità di dati probabilmente non vuoi tenere tutto in memoria. Cosa vuoi fare con questo "file" una volta che ce l'hai?

+0

Vorrei scaricarlo –

13

Quando si dice "Crea un file per l'esportazione", sono consapevole che si desidera renderlo scaricabile nel browser. Se è così, ecco un esempio.

public void btnGo_Click (Object sender, EventArgs e) 
{ 
    Response.Clear(); 

    string fileName= String.Format("data-{0}.csv", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")); 
    Response.ContentType = "text/csv"; 
    Response.AddHeader("content-disposition", "filename=" + fileName); 

    // write string data to Response.OutputStream here 
    Response.Write("aaa,bbb,ccc\n"); 

    Response.End(); 
} 

citare: RFC 4180

+0

Suppongo tu intenda che questo sia inserito in una normale pagina ASPX? Ciò funzionerebbe, ovviamente, ma non è davvero ottimale. Ci sarà un po 'di overhead per inizializzare/iniziare a generare la pagina ASPX all'inizio. – Noldorin

+0

sì, questo andrebbe in una pagina ASPX "normale". Non sei sicuro di cosa intendi per overhead, o perché quello che ho qui è sub-ottimale. – Cheeso

+0

Sì, un ASHX dovrebbe fare il lavoro bene. Ho suggerito un gestore HTTP personalizzato, ma entrambi funzionerebbero bene qui. – Noldorin

1

Si potrebbe scrivere direcly al Response.OutputStream e impostare il tipo di contenuto a destra, e l'intestazione la disposizione dei contenuti.

0

Oh, non è male. In Page_Load della tua pagina ASPX fare questo:

Response.ContentType = "text/xml"; 
Response.ContentEncoding = System.Text.Encoding.UTF8; 
Response.Write(/* your text goes here */); 

Quanto sopra è un esempio se il 'file' è XML, ma può essere qualsiasi cosa, da e file excel in un PDF. Tutto ciò che devi fare è aggiornare il ContentType che puoi cercare tramite Google o Live.

+0

wow you people are fast ... =) – JasonRShaver

0

Prova questo campione:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    Response.ContentType = "text/csv"; 
    Response.AddHeader("content-disposition", "attachment; filename=download.csv"); 
    Response.Write("your,csv,file,contents"); 
    Response.End(); 
} 
4

Ti consigliamo di guardare a scrivere una personalizzato HTTP Handler (una classe che implementa IHttpHandler) e semplicemente registrazione nel web.config. Vedere this article on MSDN per un buon esempio di come impostarne uno.

Ecco un semplice esempio di come è possibile implementare uno per restituire il markup per alcuni dati CSV.

using System.Web; 

public class MyCsvDocumentHandler : IHttpHandler 
{ 
    public static string Data 
    { 
     get; 
     set; 
    } 

    public MyCsvDocumentHandler() 
    { 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.ContentType = "text/csv"; // Set the MIME type. 
     context.Response.Write(Data); // Write the CSV data to the respone stream. 
    } 

    public bool IsReusable 
    { 
     // To enable pooling, return true here. 
     // This keeps the handler in memory. 
     get { return false; } 
    } 
} 

Questa alternativa, che è forse un po 'più semplice, è quello di utilizzare una pagina ASHX handler. Il codice sarebbe quasi identico.

+0

Nota che è anche possibile (se non documentato) collegare un IHTTPHandler senza muovere il web.config: il tipo di 'pagina' ASHX fornisce il cablaggio per te. –

+1

(Ho usato questa tecnica per generare pulsanti grafici dinamicamente in passato, penso che sia abbastanza utile). –

+0

@Tetsujin: Sì, assolutamente. In alcuni casi un gestore HTTP (IH HTTPHandler) è più desiderabile, poiché offre una flessibilità leggermente maggiore, ma un ASHX sarebbe altrettanto valido in questo caso. – Noldorin

Problemi correlati