有很多类似的问题,但仍然没有明确的答案来解决在写入一些流以响应后采取一些行动的问题。
我有以下情况:
单击按钮时,我正在生成一些 excel 文件,我将写入响应以允许用户下载生成的文件。单击该按钮后立即将其禁用,以防止双击该按钮。在 Page-Load 事件处理程序中,我有以下代码:
GenerateBTN.Attributes.Add("onclick", "this.disabled=true;" + ClientScript.GetPostBackEventReference(GenerateBTN, "").ToString());
在 Page_Load 事件处理程序之后,GenerateBTN_Click 处理程序执行生成文件所需的代码,在此方法(处理程序)结束时,我响应编写生成的文件,代码如下:
Response.Clear();
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
Response.WriteFile(@"C:\Reports\" + filename);
Response.End();
“另存为”对话框出现,用户可以下载生成的文件,但问题是已禁用的 GenerateBTN 仍处于禁用状态。如何在将生成的文件写入响应后启用它?我知道在清除当前响应后我无法继续初始响应,但是有什么办法可以解决这个问题吗?
最佳答案
您可以在页面上放置一个 IFrame 并将其可见性设置为隐藏。让您的按钮加载 IFrame 中的文件并使用 Javascript 检测 IFrame 是否仍在加载。加载完成后,启用您的按钮。
目前无法提供代码示例,但如果您决定走这条路并需要示例,请告诉我,我会更新此答案。
编辑第二个答案
您要做的是创建一个类似“Download.aspx”的文件,您将文件名作为查询字符串参数传递给该文件。这样,您可以让您的服务器从 Web 应用程序路径之外的位置获取文件并调整 header 以强制下载文件。
下载.aspx
using System.IO;
protected void Page_Load(object sender, EventArgs e)
{
string FileName = Server.UrlDecode(Request.Params["FileName"]); //Example: "MyFile.txt"
Response.AppendHeader("Content-Type", "application/force-download");
Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName);
Response.WriteFile(@"C:\MyFolder\" + FileName);
}
您可以通过调用类似“Download.aspx?FileName=MyFile.txt”的方式加载页面
您需要添加检查以确保文件存在并且查询字符串参数存在,但这应该会强制下载并允许您从其他位置获取文件。当您使用 ASPX 页面提供文件时,您还可以进行凭据检查以查看用户是否已登录到您的站点(如果您已经有登录逻辑)或将下载记录到日志文件/数据库中(如果您想保留)跟踪它。它使您可以更好地控制下载过程。
至于 IFrame 加载代码,我不是 100% 确定它如何处理文件下载,但我最初的想法是这样的——查看源代码:http://sykari.net/stuff/iframe .
关于c# - 将文件写入响应后启用按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6062555/