System.IO

Generación y descarga de archivos vía Web en tiempo de ejecución

En este artículo se tratará como generar archivos en tiempo de ejecución y retornarlos como descarga.

Muchas veces en las aplicaciones Web se desea generar un archivo para que se descargue pero no se desea almacenar en el servidor. Este archivo puede ser por ejemplo un documento de texto cuyo contenido puede ser el retornado por una base de datos o un reporte específico.

En este artículo veremos como generar un documento en el servidor para ser descargado a partir de la información digitada por un usuario en un campo de texto.

Desde Visual Studio 2005.

Generar una forma Web con un campo de texto multilínea y un botón

Para este código se utilizara el Espacio de Nombres System.IO

En el evento Clic del botón adicionar el código que se explica a continuación.

' Versión VB .Net
Imports System.IO
Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' Generar un MemorySteam donde se guardara la información temporalmente 
        Dim mystream As New MemoryStream

        ' Generar un StreamWriter para almacenar la información en el MemoryStream 
        Dim writer As New StreamWriter(mystream)

        ' El StreamWriter debe tener la posibilidad de AutoFlus para que se limpie el buffer despues de cada llamada 
        writer.AutoFlush = True

        ' Escribir en el MemoryStream el contenido digitado por el usuario 
        writer.Write(TextBox1.Text)

        Response.Clear()

        ' En la respuesta http adicionar los encabezados que describen la información de archivo 

        ' El contenido es un archivo llamado documento.txt de tipo attachment 
        Response.AppendHeader("Content-Disposition", "attachment; filename=documento.txt")

        ' La longitud del contenido es del tamano de la longitud del Stream (Nuestro documento) 
        Response.AppendHeader("Content-Length", mystream.Length.ToString())

        ' Se define el tipo de contenido 
        Response.ContentType = "application/octet-stream"

        ' Se escribe la cadena de caracteres binarios al output Stream HTTP 
        Response.BinaryWrite(mystream.ToArray())

        ' Se envía el buffer actual al usuario. En este caso el documento 
        Response.End()
    End Sub
End Class
// Versión C#

// Generar un MemorySteam donde se guardara la información temporalmente 
MemoryStream mystream = new MemoryStream(); 

// Generar un StreamWriter para almacenar la información en el MemoryStream 
StreamWriter writer = new StreamWriter(mystream); 

// El StreamWriter debe tener la posibilidad de AutoFlus para que se limpie el buffer despues de cada llamada 
writer.AutoFlush = true; 

// Escribir en el MemoryStream el contenido digitado por el usuario 
writer.Write( this.TextBox1.Text); 

Response.Clear(); 

// En la respuesta http adicionar los encabezados que describen la información de archivo 

// El contenido es un archivo llamado documento.txt de tipo attachment 
Response.AppendHeader( "Content-Disposition", "attachment; filename=documento.txt"); 

// La longitud del contenido es del tamano de la longitud del Stream (Nuestro documento) 
Response.AppendHeader( "Content-Length", mystream.Length.ToString()); 

// Se define el tipo de contenido 
Response.ContentType = "application/octet-stream"; 

// Se escribe la cadena de caracteres binarios al output Stream HTTP 
Response.BinaryWrite(mystream.ToArray()); 

// Se envía el buffer actual al usuario. En este caso el documento 
Response.End();

Con este ejemplo hemos aprendido como generar archivos en un memorystream y retornarlos al cliente en una Respuesta HTTP.

Publicado en http://www.programar.net por Rubén Darío Sánchez