2008-09-24 65 views
3

我在我的vb.net web應用程序中有一個頁面,需要將一堆數據扔到一個文本文件中,然後將其呈現給用戶進行下載。在.net Web服務器上構建這樣的文本文件的最佳/最有效的方式是什麼?在.net網站中生成文本文件的最佳方式是什麼?

編輯:回答下面的問題,這將是一次下載,然後丟棄類文件。

更新:我把約翰魯迪和大衛K的建議粘在一起,它的工作很完美。謝謝,所有!

+0

這個文件是否會被重複下載,還是一次性的? – 2008-09-24 21:01:33

回答

3

答案取決於被遺忘的分號是否需要反覆下載或一勞永逸的丟棄方式。

無論哪種方式,關鍵將設置輸出的內容類型,以確保顯示下載窗口。直接文本輸出的問題在於瀏覽器將嘗試在自己的窗口中顯示數據。

設置內容類型的核心方法與以下類似,假設文本是輸出字符串,文件名是您希望文件保存(本地)爲的默認名稱。

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

這會提示用戶下載。

現在,如果您需要將文件逐字保存在Web服務器上,這會變得更加棘手 - 但並非如此。在那裏,你想使用System.IO中的類將文本寫出到文本文件中。確保您寫入的路徑可由網絡服務,IUSR_MachineName和ASPNET Windows用戶寫入。否則,相同的交易 - 使用內容類型和標題,以確保下載。

我建議不要直接保存文件,除非你需要 - 即使如此,直接在服務器上這樣做的技術可能不是正確的想法。 (EG,如果您需要訪問控制來下載所述文件,現在您必須在您的應用根之外執行此操作,根據您的託管環境,這可能甚至可能不會)您處於一次性或文件必須真正保存模式,並且不知道安全隱患(如果您確實需要服務器端保存,您可能需要自己解決這些問題),這就是我所能做到的最好的給你。

4

使用StringBuilder創建文件的文本,然後使用Content-Disposition將其發送給用戶。

例子在這裏找到: 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()); 

} 
+0

應該明確指定編碼,最好是UTF-8 – 2008-09-24 21:09:17

4

不要建立它在所有,使用一個HttpHandler,服務文本文件直接到輸出流:

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

代碼阻止半路下來就是一個很好的例子,你可以自己調整:

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

請記住它並不需要在服務器端成爲'文件'。它是把它變成文件的客戶端。

相關問題