2009-07-02 27 views
25

Necesito escribir algunos informes y luego solicitar al usuario que lo guarde en su máquina local. La última vez que hice esto, escribí un archivo en el servidor web y luego lo envié al cliente a través del objeto Response.C# Archivo de escritura Asp.net al cliente

para crear en el servidor web

TextWriter tw = new StreamWriter(filePath); 

para enviar al cliente

page.Response.WriteFile(path); 

La pregunta es: ¿Hay alguna forma de omitir la escritura del archivo físico al servidor web y vaya a la derecha de un objeto que representa el documento a la respuesta?

Respuesta

25

podría utilizar el Response.ContentType como esto

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

Por supuesto, esto funciona si desea escribir un archivo de texto. En caso de que desee escribir un .doc, por ejemplo, cambie el ContentType a "application/msword", etc.

+0

este código escribe escribe en mi navegador. No recibo aviso. IReport rpt = new ContxReport(); string informe = rpt.makeReport(); codificación ASCIIEncoding = nueva ASCIIEncoding(); byte [] encodedReport = encoding.GetBytes (informe); Respuesta.ContentType = "text/plain"; Response.OutputStream.Write (encodedReport, 0, encodedReport.Length); Response.AddHeader ("Content-Disposition", "inline; filename = shit.csv"); Response.End(); – jim

+1

Además, debe establecer todos los encabezados antes de escribir. – Talljoe

+1

¿Qué es *** buffer ***? – Kiquenet

16

Puedes.

Prueba esto:

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

Esto le dará a solicitar al usuario abrir o guardar el archivo test.xls. del mismo modo, puede proporcionar otros objetos ASP.NET en lugar de Tabla.

+0

Debería poder utilizar Response.Output en lugar de crear un StringWriter. – Talljoe

+0

Tengo 2 preguntas. 1) ¿Volverá ese archivo a ser capaz? y 2) ¿Es posible la conexión múltiple si se usa un administrador de descargas como IDM, etc.? – shashwat

+2

@ShashwatTripathi No estoy seguro. Este fue un código que utilicé hace mucho tiempo. En mi humilde opinión, no admitirá reanudar o múltiples conexiones de descarga. –

5

Sí.

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

Tengo 2 preguntas. 1) ¿Volverá ese archivo a ser capaz? y 2) ¿Es posible la conexión múltiple si se usa un administrador de descargas como IDM, etc.? – shashwat

5

La respuesta exacta a la pregunta depende de cómo se haya organizado su informe (es decir, ¿cuál es el "objeto" se está refiriendo a). Si tiene una sola cadena, puede usar Response.Write para simplemente escribirla. Si necesita un TextWriter, Response.Output es lo que quiere, de esa manera puede omitir escribir en el disco y luego usar WriteFile. Además, si tu contenido resulta ser binario, puedes usar Response.OutputStream para eso.

Es posible que también desee establecer Response.AddHeader ("Content-Disposition", "attachment"), si desea que el usuario vea un cuadro de diálogo para guardar el archivo. Sin embargo, Content-Disposition no necesariamente se respeta, por lo que el usuario aún puede obtener el informe abierto directamente en el navegador. ¡Recuerde establecer encabezados antes de mostrar el contenido real!

Además, dependiendo del formato del informe, es posible que desee establecer Response.ContentType en algo apropiado como text/plain, text/csv o lo que sea que tenga. Los tipos de mime correctos se enumeran en the IANA site.

Cuestiones relacionadas