我正在尝试从屏幕下载一些文本输出作为文本文件。以下是代码。它在某些页面上工作,而在其他页面上根本不工作。任何人都可以在这里建议有什么问题吗?
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());
}
答案 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\"");
答案 1 :(得分:4)
如果这是您的实际代码,您永远不会将文本写入响应流,因此浏览器永远不会收到任何数据。
至少,你需要
Response.Write(sb.ToString());
将文本数据写入响应。此外,作为额外的奖励,如果您事先知道长度,则应使用Content-Length
标题提供,以便浏览器显示下载进度。
您还将Response.Buffer = true;
设置为方法的一部分,但从不显式刷新响应以将其发送到浏览器。尝试在写声明后添加Response.Flush()
。