我在我的vb.net web應用程序中有一個頁面,需要將一堆數據扔到一個文本文件中,然後將其呈現給用戶進行下載。在.net Web服務器上構建這樣的文本文件的最佳/最有效的方式是什麼?在.net網站中生成文本文件的最佳方式是什麼?
編輯:回答下面的問題,這將是一次下載,然後丟棄類文件。
更新:我把約翰魯迪和大衛K的建議粘在一起,它的工作很完美。謝謝,所有!
我在我的vb.net web應用程序中有一個頁面,需要將一堆數據扔到一個文本文件中,然後將其呈現給用戶進行下載。在.net Web服務器上構建這樣的文本文件的最佳/最有效的方式是什麼?在.net網站中生成文本文件的最佳方式是什麼?
編輯:回答下面的問題,這將是一次下載,然後丟棄類文件。
更新:我把約翰魯迪和大衛K的建議粘在一起,它的工作很完美。謝謝,所有!
答案取決於被遺忘的分號是否需要反覆下載或一勞永逸的丟棄方式。
無論哪種方式,關鍵將設置輸出的內容類型,以確保顯示下載窗口。直接文本輸出的問題在於瀏覽器將嘗試在自己的窗口中顯示數據。
設置內容類型的核心方法與以下類似,假設文本是輸出字符串,文件名是您希望文件保存(本地)爲的默認名稱。
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,如果您需要訪問控制來下載所述文件,現在您必須在您的應用根之外執行此操作,根據您的託管環境,這可能甚至可能不會)您處於一次性或文件必須真正保存模式,並且不知道安全隱患(如果您確實需要服務器端保存,您可能需要自己解決這些問題),這就是我所能做到的最好的給你。
使用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());
}
應該明確指定編碼,最好是UTF-8 – 2008-09-24 21:09:17
不要建立它在所有,使用一個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
}
}
請記住它並不需要在服務器端成爲'文件'。它是把它變成文件的客戶端。
這個文件是否會被重複下載,還是一次性的? – 2008-09-24 21:01:33