【问题标题】:Download text as a file from a webpage从网页下载文本作为文件
【发布时间】:2011-04-07 10:32:34
【问题描述】:

我正在从网站下载文本,我希望用户能够将其保存为文件。所以,我有以下代码可以做到这一点。

protected void DownloadFile(string fileName, string content)
{
    Response.Clear();
    Response.ClearContent();
    Response.ClearHeaders();
    Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
    Response.ContentType = "text/plain";
    Response.Write(content);
    Response.End();
}

我遇到的问题是这段代码运行后出现异常。我相信这是因为我调用了 Response.End()。因此,每次用户下载文件时,它都会将他们重定向到通用错误页面,因为所有通用异常都会重定向到该页面。

关于如何将文本写入文件而不出现此错误的任何想法?如果我删除 Response.End() 我得到我的文本,然后是 HttpResponse 文本的其余部分,但我没有得到错误。

谢谢。

【问题讨论】:

  • 你可以在catch()中捕获异常而不做任何事情
  • 这就是我现在的处理方式,但如果没有必要,我宁愿不吃异常。所以,我只是想找到一种不同/更好的方法来实现这一点。
  • 为什么要调用 Reponse.End()?您似乎是从 ASP.NET WebForm 调用此方法。确实如此,只要让 ASP.NET 管道在响应实际结束时关闭响应流。
  • 永远不要吃异常而不至少在某处记录它。至少,使用 Elmah (code.google.com/p/elmah) 将异常记录到数据库中。
  • 你遇到了什么异常?

标签: c# asp.net


【解决方案1】:

首先,如果此代码位于 .ASPX 文件中,您需要将其移出到 .ASHX 文件中。 其次,在您移至 .ASHX 后,您可以简单地写入输出流并完成,您不需要 Response.End();

这是我开始时的链接:http://dotnetperls.com/ashx-handler——没有太多内容。它只是消除了一堆 asp.net“页面”开销。


理想情况下,您应该有一个带有列表的页面,以及指向“download.ashx”文件的链接/按钮。然后将查询字符串上的记录 id 传递给它,以便它可以进行查找和 response.write 调用。

【讨论】:

  • 它在 aspx.cs 文件的基类中,但如果通过将其移动到 ASHX 文件可以解决问题,那么我想知道如何做到这一点。你能举个例子吗?
  • 发布了我开始学习 ASHX 处理程序时使用的链接。
  • 我不确定这是否可行。这是页面......它有一个用户可以下载的文件列表。每个文件信息旁边都有一个下载按钮。该文件的内容存在于我们的数据库中,而不是实际文件中,因此我需要将内容作为字符串传递。我需要用户正在查看的页面保持不变,并且不会被覆盖,并且通过使用 HttpHandler 它将覆盖页面......除非我做错了。明白我的意思吗?
【解决方案2】:

不要打电话给Response.End()。无论您是否打算填充标头后,仍有代码要在服务器端运行。而是考虑使用Response.Flush() 并允许页面完成。另一种选择是使用 HttpHandler (ashx) 文件而不是 aspx/ascx 文件。这将为您提供对响应的更多基本访问权限,因此您应该能够在没有影响的情况下结束。

【讨论】:

  • 使用 Response.Flush() 没有帮助,因为它允许将其余响应写入我的文件。我只想将我给它的文本写入文件。我正在研究使用 HttpHandler,但看起来使用它会删除页面上的内容,然后显示下载文件对话框。我需要保留页面上的内容。
  • @Dan H - 您可以尝试覆盖页面的渲染事件以消除页面可能写入的任何内容。
  • 知道了!如果 Response.ContentType == "text/plain",我对 Render 事件进行了覆盖并阻止它继续。这对我们有用,因为我们所有的页面都是“text/html”。 protected override void Render(HtmlTextWriter writer) { if (Response.ContentType != "text/plain") { base.Render(writer); } } 谢谢!
【解决方案3】:

也许您想改为致电Response.Output.Write()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多