2009-05-22 16 views
5

Me gustaría crear un archivo de texto para exportar/descargar, como un * .csv, desde una aplicación ASP.NET. Sé de Response.TransmitFile, pero quiero hacerlo sin crear y guardar un archivo físicamente en el servidor. ¿Es eso posible? ¿Alguien ha hecho algo así?En ASP.NET, ¿cómo lograr que el navegador descargue contenido de cadenas en un archivo? (C#)

+0

¿podría ser un poco más específico? ¿Quiere decir que quiere tomar una cadena y guardarla en un archivo en el cliente y nunca crear un archivo en el servidor? –

Respuesta

1

Un archivo que aún no ha guardado es solo una variable de cadena o un MemoryStream. Pero para grandes cantidades de datos, probablemente no desee mantener todo en la memoria. ¿Qué quieres hacer con este "archivo" una vez que lo tienes?

+0

Deseo descargarlo –

13

Cuando dices "Crear un archivo para exportar", entiendo que quieras que se pueda descargar en el navegador. Si ese es el caso, aquí hay un ejemplo.

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

citan: RFC 4180

+0

Supongo que tiene la intención de colocarlo en una página ASPX normal. Eso funcionaría, por supuesto, pero no es realmente óptimo. Habrá algunos gastos generales para inicializar/comenzar a generar la página ASPX en el inicio. – Noldorin

+0

sí, esto iría en una página ASPX "normal". No estoy seguro de lo que quiere decir con sobrecarga, o por qué lo que tengo aquí no es óptimo. – Cheeso

+0

Sí, una ASHX debería hacer bien el trabajo. Sugerí un controlador HTTP personalizado, pero cualquiera funcionaría bien aquí. – Noldorin

1

Se puede escribir direcly a la Response.OutputStream y establecer el tipo de contenido correcto, y encabezado de disposición de contenido.

0

Oh, eso no está nada mal. En su página ASPX Load hacer esto:

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

Lo anterior es un ejemplo, si su 'archivo' es XML, pero puede ser cualquier cosa, desde y archivo de Excel a un archivo PDF. Todo lo que tiene que hacer es actualizar el ContentType que puede buscar a través de Google o Live.

+0

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

0

probar este ejemplo:

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

Usted querrá buscar en la escritura de un personalizada HTTP Handler (una clase que implementa IHttpHandler) y sólo tiene que registrarse en web.config. Consulte this article on MSDN para ver un buen ejemplo de cómo configurar uno.

Aquí hay un ejemplo básico de cómo puede implementar uno para devolver el marcado de algunos datos 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; } 
    } 
} 

Esta alternativa, que es posiblemente un poco más simple, es el uso de una página de ASHX handler. El código sería casi idéntico.

+0

Tenga en cuenta que también es posible (si está poco documentado) vincular un IHTTPHandler sin dañar su web.config: el tipo ASHX 'página' proporciona el cableado para usted. –

+1

(He utilizado esta técnica para generar botones gráficos dinámicamente en el pasado, creo que es bastante útil). –

+0

@Tetsujin: Sí, absolutamente. En algunos casos, es más conveniente un controlador HTTP (IHttpHandler), ya que ofrece un poco más de flexibilidad, pero un ASHX sería igual de bueno en este caso. – Noldorin

Cuestiones relacionadas