在.net网站上生成文本文件的最佳方法是什么?

时间:2008-09-24 20:57:16

标签: .net vb.net download text-files

我的vb.net Web应用程序中有一个页面,需要将一堆数据丢入文本文件,然后将其呈现给用户下载。在.net Web服务器上构建此类文本文件的最佳/最有效方法是什么?

编辑:要回答下面的问题,这将是一次下载,然后丢弃一种文件。

更新:我将John Rudy和DavidK的建议粘在一起,并且完美无缺。谢谢,全部!

4 个答案:

答案 0 :(得分: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());

}

答案 1 :(得分: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
   }                      
}

答案 2 :(得分:3)

答案取决于是否像Forgotten Semicolon所提到的那样,需要重复下载或一次性完成。

无论哪种方式,关键是设置输出的内容类型以确保显示下载窗口。直接文本输出的问题是浏览器将尝试在自己的窗口中显示数据。

设置内容类型的核心方法类似于以下内容,假设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用户写入。否则,同样的交易 - 使用内容类型和标题来确保下载。

除非您需要,否则我建议不要直接保存文件 - 即使这样,直接在服务器上执行此操作的技术可能也不是正确的想法。 (EG,如果您需要访问控制来下载所述文件,该怎么办?现在您必须在您的应用程序根目录之外执行此操作,根据您的托管环境,这可能会也可能不会。)

所以不知道你是处于一次性还是文件必须真正保存模式,并且不知道安全隐患(如果你真的需要服务器端保存,你可能需要自己解决)那是我能给你的最好的。

答案 3 :(得分:0)

请记住,它不需要是服务器端的“文件”。它是将客户端变成文件的客户端。