Estoy tratando de escribir a un archivo de texto en la memoria y luego descargar el archivo sin guardar el archivo en el disco duro. Estoy usando el StringWriter para escribir el contenido:

StringWriter oStringWriter = new StringWriter();
oStringWriter.Write("This is the content");

¿Cómo puedo, a continuación, descargue este archivo?

EDITAR:
Fue la combinación de las respuestas que me dio mi solución. Aquí está:

StringWriter oStringWriter = new StringWriter();
oStringWriter.WriteLine("Line 1");
Response.ContentType = "text/plain";

Response.AddHeader("content-disposition", "attachment;filename=" + string.Format("members-{0}.csv",string.Format("{0:ddMMyyyy}",DateTime.Today)));
Response.Clear();

using (StreamWriter writer = new StreamWriter(Response.OutputStream, Encoding.UTF8))
{
    writer.Write(oStringWriter.ToString());
}
Response.End();
InformationsquelleAutor higgsy | 2010-12-31

7 Comentarios

  1. 15

    Vez de almacenar los datos en la memoria y, a continuación, enviarlo a la secuencia de respuesta, usted puede escribir directamente a la secuencia de respuesta:

    using (StreamWriter writer = new StreamWriter(Response.OutputStream, Encoding.UTF8)) {
      writer.Write("This is the content");
    }

    El ejemplo se utiliza la codificación UTF-8, debe cambiar que si usted está usando alguna otra codificación.

    • Hola Guffa – ¿cómo puedo, a continuación, obtener la secuencia de respuesta a descargar aunque?
    • Agregar instrucciones para el contenido de la disposición y el tipo de contenido en el encabezado, para que el navegador sepa lo que es. Klaus Byskow Hoffman tiene algunos ejemplos en su respuesta, pero usted no tiene que utilizar un controlador HTTP para devolver la respuesta, trabaja con una página normal también. Usted debe especificar la codificación en el tipo de contenido, por ejemplo text/plain; charset=utf-8.
  2. 17

    Esta resuelto para mí:

            MemoryStream ms = new MemoryStream();
            TextWriter tw = new StreamWriter(ms);
            tw.WriteLine("Line 1");
            tw.WriteLine("Line 2");
            tw.WriteLine("Line 3");
            tw.Flush();
            byte[] bytes = ms.ToArray();
            ms.Close();
    
            Response.Clear();
            Response.ContentType = "application/force-download";
            Response.AddHeader("content-disposition", "attachment;    filename=file.txt");
            Response.BinaryWrite(bytes);
            Response.End();     
  3. 5

    Básicamente de crear un HttpHandler por la aplicación de la IHttpHandler de la interfaz. En el ProcessRequest método que básicamente, sólo tiene que escribir el texto a context.Response. También es necesario agregar un Content-Disposition encabezado http:

    context.Response.AddHeader("Content-Disposition", "attachment; filename=YourFileName.txt");

    También recuerda poner la ContentType:

    context.Response.ContentType = "text/plain";
  4. 2

    Sólo una pequeña adición a las otras respuestas. Al final de la descarga me ejecución:

    context.Response.Flush();
    context.ApplicationInstance.CompleteRequest();

    Me enteré de que, de lo contrario, la descarga a veces no se completa correctamente.

    Esta de Grupos de Google publicación también señala que Response.End lanza una ThreadAbortException que se puede evitar mediante el uso de la CompleteRequest método.

    • de hecho cuando he utilizado las líneas que has añadido , el archivo generado contenía el texto que escribí en la corriente más el rendred código html así que tuve que volver en el código y sólo hay que poner la «Respuesta.Final de línea » y funcionó muy bien !
    • Por lo general, yo sólo proporcionan descargas a través de diferentes ASHX controladores, no en las páginas ASPX.
  5. 0

    He tenido muchos problemas con esto. Finalmente se encontró una solución que parece funcionar cada vez.

    En la mayoría de los casos el usuario haga clic en un botón para la descarga. En este punto lo mejor es redirigir la página de nuevo al mismo lugar. agregar un parámetro en la url que puede agarrar y leer.

    ejemplo( http://www.somewhere.com/mypage.aspx?print=stuff)

        <asp:Button ID="btn" runat="server" Text="print something" OnClick="btn_Click" />
    
    
        protected void Page_Load(object sender, EventArgs e) {
            if (Request["print"] == "stuff") { Print("my test content"); }
        }
    
        /* or pass byte[] content*/
        private void Print(string content ){ 
            Response.ContentType = "text/plain";
            Response.AddHeader("content-disposition", "attachment;filename=myFile.txt");
            //Response.BinaryWrite(content);
            Response.Write(content);
            Response.Flush(); 
            Response.End();
        }
    
        protected void btn_Click(object sender, EventArgs e) {
            //postbacks give you troubles if using async.
            //Will give an error when Response.End() is called.
            Response.Redirect(Request.Url + "?print=queue");
        }
  6. 0

    Extensión de @Vinicious respuesta.

    Me había datos que pueden contener comas. La solución más común es escapar de ese pedazo de datos por encerrarla entre comillas, mientras se asegura de que también escapar las comillas que también podría ser una parte de los datos.

    Uno frotar me vino en contra y una advertencia al escribir CSV, excel no le gusta que si pones espacios trailing su comas. descubierto la solución a mi problema de superusuario respuesta

    protected void btnDownload_Click(object sender, EventArgs e)
    {
        MemoryStream ms = new MemoryStream();
        TextWriter tw = new StreamWriter(ms, System.Text.Encoding.UTF8);
        var structures = KAWSLib.BusinessLayer.Structure.GetStructuresInService();
        //*** comma delimited
        tw.Write("Latitude, Longitude, CountySerial, StructureType, Orientation, District, RoutePre, RouteNo, LocationDesc");
        foreach (var s in structures)
        {
            tw.Write(Environment.NewLine + string.Format("{0:#.000000},{1:#.000000},{2},{3},{4},{5},{6},{7},{8}", s.LATITUDE, s.LONGITUDE, s.CO_SER, EscapeIfNeeded(s.SuperTypeLookup.SHORTDESC), EscapeIfNeeded(s.OrientationLookup.SHORTDESC), s.DISTRICT, s.ROUTE_PREFIX, s.RouteValue, EscapeIfNeeded(s.LOC_DESC)));
        }
        tw.Flush();
        byte[] bytes = ms.ToArray();
        ms.Close();
    
        Response.Clear();
        Response.ContentType = "application/force-download";
        Response.AddHeader("content-disposition", "attachment;    filename=" + string.Format("kaws-structures-{0:yyyy.MM.dd}.csv", DateTime.Today));
        Response.BinaryWrite(bytes);
        Response.End();
    }
    
    string EscapeIfNeeded(string s)
    {
        if (s.Contains(","))
        {
            return "\"" + s.Replace("\"", "\"\"") + "\"";
        }
        else
        {
            return s;
        }
    }

    A continuación va a causar un problema para excel. En excel la primera cita se convertirá en parte de los datos y, en consecuencia, de separar en el incrustados coma. Espacios malo.

     tw.Write(Environment.NewLine + string.Format("{0:#.000000}, {1:#.000000}, {2}, {3}, {4}, {5}, {6}, {7}, {8}", s.LATITUDE, s.LONGITUDE, s.CO_SER, EscapeIfNeeded(s.SuperTypeLookup.SHORTDESC), EscapeIfNeeded(s.OrientationLookup.SHORTDESC), s.DISTRICT, s.ROUTE_PREFIX, s.RouteValue, EscapeIfNeeded(s.LOC_DESC)));

Dejar respuesta

Please enter your comment!
Please enter your name here