8

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

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

2 回答 2

29

正如 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

于 2013-02-07T16:03:17.480 回答
4

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

至少,你应该需要

Response.Write(sb.ToString());

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

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

于 2013-02-07T15:56:23.203 回答