2

我在文件中生成一组字母,但如果有错误,则文件可能不完整。我还是想发送文件,但会向用户发出警告。所以我有这个:

      string errMessage;
        string filePath = CCGTMarblox.Admin.Helpers.DocumentHelper.GenerateRejectionLetters(grantIDs, out errMessage);

        if (!String.IsNullOrEmpty(errMessage))
        {
            ScriptManager.RegisterStartupScript(Page, Page.GetType(), "problem", String.Format("alert('{0}');", errMessage), true);
        }

        if (filePath != null)
        {
            System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
            Response.ClearHeaders();
            Response.AddHeader("Content-Disposition", string.Format(@"attachment; filename=""{0}""", fileInfo.Name));
            Response.AddHeader("Content-Length", fileInfo.Length.ToString());
            Response.ContentType = "application/octet-stream";
            Response.TransmitFile(fileInfo.FullName);
            Response.Flush();
        }

问题是当包含下载文件的代码时没有显示警报 - 标头被清除,就像一个新的响应。有什么办法可以发送脚本和文件吗?我尝试将 Response.Redirect 重定向到检索文件的页面,但这也不起作用。

实际上,我最后所做的是发送另一个启动脚本,该脚本执行与我在问题中尝试的重定向类似的任务。(我已经有一个处理下载的页面)。

编辑(在接受答案后添加)

string script = String.Format("window.location = '{0}';", url);        
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "goToDownload", script, true);
4

2 回答 2

4

我建议有一个页面来指示用户文件下载将很快开始,并且在此页面中,您可以显示任何警告。

此页面将使用 JS / 元刷新对文件发出单独的请求并继续下载。如果下载未在指定时间开始,您可能还需要提供直接链接。

于 2012-10-09T16:09:44.560 回答
1

您不能在单个 GET 中返回 HTML 和另一个响应(用于文件流)。

您可以返回 HTML 并在此处提供下载文件的链接。

于 2012-10-09T16:10:20.443 回答