Domanda

Ho una pagina nella mia applicazione web vb.net che deve lanciare un mucchio di dati in un file di testo e poi presentarli all'utente per il download. Qual è il modo migliore / più efficiente per creare un tale file di testo su un server web .net?

Modifica: per rispondere a una domanda in basso, si tratterà di un download una volta e quindi di eliminare il tipo di file.

Aggiornamento: ho incollato insieme i suggerimenti di John Rudy e DavidK, e ha funzionato perfettamente. Grazie a tutti!

È stato utile?

Soluzione

La risposta dipenderà dal fatto che, come menzionato il punto e virgola dimenticato, siano necessari download ripetuti o gettate una sola volta.

In entrambi i casi, la chiave sarà quella di impostare il tipo di contenuto dell'output per garantire che venga visualizzata una finestra di download. Il problema con l'output di testo semplice è che il browser tenterà di visualizzare i dati nella propria finestra.

Il modo principale per impostare il tipo di contenuto sarebbe qualcosa di simile al seguente, supponendo che il testo sia la stringa di output e il nome file sia il nome predefinito in cui si desidera salvare il file (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();

Questo richiederà un download per l'utente.

Ora diventa più complicato se devi letteralmente salvare il file sul tuo server web, ma non in modo terribile. Lì vorresti scrivere il testo nel tuo file di testo usando le classi in System.IO. Assicurarsi che il percorso in cui si scrive sia scrivibile dagli utenti del servizio di rete, IUSR_MachineName e ASPNET Windows. Altrimenti, stesso affare - usa il tipo di contenuto e le intestazioni per garantire il download.

Consiglio di non salvare letteralmente il file a meno che non sia necessario - e anche in questo caso, la tecnica per farlo direttamente sul server potrebbe non essere l'idea giusta. (Ad esempio, cosa succede se è necessario il controllo dell'accesso per scaricare tale file? Ora dovresti farlo al di fuori della radice dell'app, il che potrebbe essere o meno possibile a seconda dell'ambiente di hosting.)

Quindi senza sapere se ci si trova in una modalità una tantum o in cui il file deve essere veramente salvato e senza conoscere le implicazioni di sicurezza (che probabilmente dovrai risolvere da solo se hai davvero bisogno di salvataggi sul lato server) , questo è il meglio che posso darti.

Altri suggerimenti

Utilizzare StringBuilder per creare il testo del file, quindi inviarlo all'utente utilizzando Content-Disposition.

Esempio trovato qui: http://www.eggheadcafe.com/community/ aspnet / 17/76432 / uso-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());

}

Non costruirlo affatto, usa un HttpHandler e servi il file di testo direttamente nel flusso di output:

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

Il blocco di codice a metà strada è un buon esempio, puoi adattarti al tuo:

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
   }                      
}

Ricorda che non è mai necessario che sia un 'file' alla fine del server. È il client che lo trasforma in un file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top