Pregunta

Tengo una página en mi aplicación web vb.net que necesita reunir un montón de datos en un archivo de texto y luego presentarlos al usuario para su descarga. ¿Cuál es la forma mejor / más eficiente de crear un archivo de texto en un servidor web .net?

Editar: para responder a una pregunta más abajo, esta será una descarga y luego se desechará.

Actualización: pegué las sugerencias de John Rudy y DavidK, y funcionó perfectamente. Gracias a todos!

¿Fue útil?

Solución

La respuesta dependerá de si, como lo menciona el punto y coma Olvidado, necesita descargas repetidas o tiradas de una vez y hecho.

De cualquier manera, la clave será establecer el tipo de contenido de la salida para garantizar que se muestre una ventana de descarga. El problema con la salida de texto directo es que el navegador intentará mostrar los datos en su propia ventana.

La forma principal de establecer el tipo de contenido sería algo similar a lo siguiente, asumiendo que el texto es la cadena de salida y el nombre de archivo es el nombre predeterminado en el que se guardará el archivo (localmente).

HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.ContentType = "application/octet-stream";
response.Charset = "";
response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0}\"", filename));
response.Flush();
response.Write(text);
response.End();

Esto provocará una descarga para el usuario.

Ahora se vuelve más complicado si necesita guardar literalmente el archivo en su servidor web, pero no tanto. Allí querrá escribir el texto en su archivo de texto usando las clases en System.IO. Asegúrese de que la ruta en la que escribe sea escribible por los usuarios de Servicio de red, IUSR_MachineName y ASPNET de Windows. De lo contrario, el mismo acuerdo: use el tipo de contenido y los encabezados para garantizar la descarga.

Recomiendo no guardar literalmente el archivo a menos que lo necesite, e incluso entonces, la técnica de hacerlo directamente en el servidor puede no ser la idea correcta. (Por ejemplo, ¿qué sucede si necesita control de acceso para descargar dicho archivo? Ahora tendría que hacerlo fuera de la raíz de la aplicación, lo que puede o no ser posible dependiendo de su entorno de alojamiento).

Por lo tanto, sin saber si está en un modo de archivo único o de archivo que debe guardarse realmente, y sin conocer las implicaciones de seguridad (que probablemente necesitará resolver usted mismo si realmente necesita guardar en el lado del servidor) , eso es lo mejor que puedo darte.

Otros consejos

Use un StringBuilder para crear el texto del archivo y luego envíelo al usuario usando Content-Disposition.

Ejemplo encontrado aquí: http://www.eggheadcafe.com/community/ aspnet / 17/76432 / use-the-contentdispositi.aspx

private void Button1_Click(object sender, System.EventArgs e)
{
        StringBuilder output = new StringBuilder;
        //populate output with the string content
        String fileName = "textfile.txt";

        Response.ContentType = "application/octet-stream";
        Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
        Response.WriteFile(output.ToString());

}

No lo genere, use un HttpHandler y sirva el archivo de texto directamente en la secuencia de salida:

http://digitalcolony.com/labels/HttpHandler.aspx

El bloque de código a mitad de camino es un buen ejemplo, puedes ajustarlo a tu propio:

public void ProcessRequest(HttpContext context)
{
   response = context.Response;
   response.ContentType = "text/xml";       
   using (TextWriter textWriter = new StreamWriter(response.OutputStream, System.Text.Encoding.UTF8))
   {
       XmlTextWriter writer = new XmlTextWriter(textWriter);
       writer.Formatting = Formatting.Indented;
       writer.WriteStartDocument();
       writer.WriteStartElement("urlset");
       writer.WriteAttributeString("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
       writer.WriteAttributeString("xsi:schemaLocation", "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd");
       writer.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");

       // Add Home Page
       writer.WriteStartElement("url");
       writer.WriteElementString("loc", "http://example.com");
       writer.WriteElementString("changefreq", "daily");
       writer.WriteEndElement(); // url

       // Add code Loop here for page nodes
       /*
       {
           writer.WriteStartElement("url");
           writer.WriteElementString("loc", url);
           writer.WriteElementString("changefreq", "monthly");
           writer.WriteEndElement(); // url
       }
       */
       writer.WriteEndElement(); // urlset
   }                      
}

Tenga en cuenta que no siempre es necesario que sea un "archivo" en el extremo del servidor. Es el cliente el que lo convierte en un archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top