我的 vb.net Web 应用程序中有一个页面,需要将一堆数据放入文本文件中,然后将其呈现给用户以供下载。在.net web 服务器上构建这样一个文本文件的最佳/最有效的方法是什么?
编辑:回答下面的问题,这将是一次下载然后丢弃的文件。
更新:我将 John Rudy 和 DavidK 的建议结合在一起,效果很好。谢谢大家!
我的 vb.net Web 应用程序中有一个页面,需要将一堆数据放入文本文件中,然后将其呈现给用户以供下载。在.net web 服务器上构建这样一个文本文件的最佳/最有效的方法是什么?
编辑:回答下面的问题,这将是一次下载然后丢弃的文件。
更新:我将 John Rudy 和 DavidK 的建议结合在一起,效果很好。谢谢大家!
使用 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());
}
根本不构建它,使用 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
}
}
正如被遗忘的分号所提到的,答案将取决于您是否需要重复下载或一次性使用。
无论哪种方式,关键是设置输出的内容类型以确保显示下载窗口。直接文本输出的问题是浏览器会尝试在自己的窗口中显示数据。
设置内容类型的核心方法类似于以下内容,假设 text 是输出字符串,filename 是您希望将文件保存(本地)为的默认名称。
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 用户写入。否则,同样的交易——使用内容类型和标题来确保下载。
除非您需要,否则我建议不要从字面上保存文件——即使那样,直接在服务器上执行此操作的技术也可能不是正确的想法。(例如,如果您需要访问控制来下载所述文件怎么办?现在您必须在您的应用程序根目录之外执行此操作,这可能会也可能不会,具体取决于您的托管环境。)
因此,不知道您是处于一次性模式还是文件必须真正保存模式,也不知道安全隐患(如果您真的需要服务器端保存,您可能需要自己解决),这就是我能给你的最好的。
请记住,它不需要成为服务器端的“文件”。是客户端将其转换为文件。