在ASP.NET中将文本下载为文件

时间:2013-02-07 15:54:31

标签: c# asp.net

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

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());
}

2 个答案:

答案 0 :(得分:25)

正如Joshua已经提到的,您需要将文本写入输出流(Response)。另外,不要忘记在此之后调用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

答案 1 :(得分:4)

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

至少,你需要

Response.Write(sb.ToString());

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

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