在.net网站中生成文本文件的最佳方法是什么?
我的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用户可以写入写入的路径。否则,使用相同的方法-使用内容类型和标头以确保下载。
我建议不要从字面上保存文件,除非我们需要-即使那样,直接在服务器上这样做的技术可能也不是正确的主意。 (例如,如果我们需要访问控制来下载所说文件,该怎么办?现在,我们必须在应用程序根目录之外执行此操作,根据托管环境,这可能会或者可能不会。
因此,在不知道我们处于一次性模式还是文件必须真正保存的模式下,并且又不知道安全隐患(如果我们确实需要服务器端保存,可能需要自行解决),这就是我能给你的最好的。