【问题标题】:Download text as file in ASP.NET在 ASP.NET 中将文本下载为文件
【发布时间】:2013-02-07 15:54:31
【问题描述】:

我正在尝试从屏幕上下载一些文本输出作为文本文件。以下是代码。它在某些页面上工作,而在其他页面上根本不工作。谁能建议这里有什么问题?

protected void Button18_Click(object sender, EventArgs e){
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "text/plain";
    Response.AppendHeader("content-disposition", "attachment;filename=output.txt");

    StringBuilder sb = new StringBuilder();
    string output = "Output";
    sb.Append(output);
    sb.Append("\r\n");
    Response.Write(sb.ToString());
}

【问题讨论】:

  • 如果某人告诉你“它在某些页面上工作,而在其他页面上根本不工作”,你能解决他的问题吗?跨度>

标签: c# asp.net .net


【解决方案1】:

正如 Joshua 已经提到的,您需要将文本写入输出流(响应)。另外,不要忘记在那之后调用 Response.End()。

protected void Button18_Click(object sender, EventArgs e)
{
    StringBuilder sb = new StringBuilder();
    string output = "Output";
    sb.Append(output);
    sb.Append("\r\n");

    string text = sb.ToString();

    Response.Clear();
    Response.ClearHeaders();

    Response.AppendHeader("Content-Length", text.Length.ToString());
    Response.ContentType = "text/plain";
    Response.AppendHeader("Content-Disposition", "attachment;filename=\"output.txt\"");

    Response.Write(text);
    Response.End();
}

编辑 1:添加更多细节

编辑 2:我正在阅读其他 SO 帖子,用户建议在文件名周围加上引号:

Response.AppendHeader("content-disposition", "attachment;filename=\"output.txt\"");

来源: https://stackoverflow.com/a/12001019/558486

【讨论】:

  • 感谢您的回复,上面的代码仍然无法正常工作。文件下载对话框没有被调用。
  • 我也会考虑将数据写入二进制。
  • @RuiJarimba 该按钮位于更新面板中,当我删除更新面板时,它起作用了。
  • 此代码在与 <a href= ""/> 一起使用时有效,但不适用于 Button。实际上我正在发送带有 URL 的参数,所以我必须使用 http get 或 post with button。有什么想法吗?
  • It's Write 不要忘记使用 Response.End();
【解决方案2】:

如果这是您的实际代码,您永远不会将文本写入响应流,因此浏览器永远不会收到任何数据。

至少,你应该需要

Response.Write(sb.ToString());

将您的文本数据写入响应。另外,作为额外的奖励,如果您事先知道长度,您应该使用 Content-Length 标头提供它,以便浏览器可以显示下载进度。

您还将Response.Buffer = true; 设置为方法的一部分,但从不明确刷新响应以将其发送到浏览器。尝试在您的 write 语句后添加 Response.Flush()

【讨论】:

  • 抱歉,忘记在上面的代码中包含该行。它仍然无法正常工作。谢谢。
  • @Vj87 查看我的更新,您正在缓冲,因此它可能不会在您期望的时候将内容发送到浏览器。此外,如果这是大量文本,则在服务器缓冲所有内容之前,不会将整个文件发送到浏览器。您也可以尝试将Response.Buffer 设置为false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多