12

前几天,在堆栈溢出的一些出色帮助下,我整理了一个下载脚本。但是我现在发现,在下载文件后,我需要重新加载页面以摆脱 aspx 页面上的进度模板。在我添加下载代码之前,删除模板的代码有效。

删除进度模板的代码: upFinanceMasterScreen.Update();

我试过在重定向到IHttpHandler

Response.Redirect("Download.ashx?ReportName=" + "RequestingTPNLeagueTable.pdf");


public class Download : IHttpHandler {

public void ProcessRequest(HttpContext context)
{    

   StringBuilder sbSavePath = new StringBuilder();
   sbSavePath.Append(DateTime.Now.Day);
   sbSavePath.Append("-");
   sbSavePath.Append(DateTime.Now.Month);
   sbSavePath.Append("-");
   sbSavePath.Append(DateTime.Now.Year);

    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.ContentType = "application/pdf";
    HttpResponse objResponce = context.Response;
    String test = HttpContext.Current.Request.QueryString["ReportName"];
    HttpContext.Current.Response.AppendHeader("content-disposition", "attachment; filename=" + test);
    objResponce.WriteFile(context.Server.MapPath(@"Reports\" + sbSavePath + @"\" + test));    

}
 public bool IsReusable { get { return true; } } 

感谢您的任何帮助,您可以提供!

4

4 回答 4

34

当您发回文件供用户下载时,就是 HTTP 请求。换句话说,您可以一个刷新浏览器页面的回发,或者您可以发送一个文件供用户下载。如果没有特殊的技巧,你不能同时做到这两点。

这就是为什么大多数网站在您下载文件时,首先会将您带到一个新页面,上面写着“您的下载即将开始”,然后随后将您“重定向”到要使用元刷新或 javascript 下载的文件。

例如,当你去这里下载 .NET 4 运行时:

http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true

它呈现页面,然后使用以下元刷新标记实际为用户提供要下载的文件:

<META HTTP-EQUIV="refresh" content=".1; URL=http://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe" />

您可能必须在您的应用程序中执行类似的操作。但是,如果您真的有兴趣在文件完全下载做某事,那么您就不走运了,因为没有事件可以将其传达给浏览器。做到这一点的唯一方法是在您上传附件时像 gmail 一样使用AJAX 上传。

于 2010-10-26T15:51:37.327 回答
10

就我而言,我使用的是 MVC,我只是希望在选择下载按钮后几秒钟刷新页面以显示新的下载计数。我正在从控制器返回文件。

为此,我只是通过将 onclick 事件添加到调用以下脚本(也在视图中)的下载按钮来更改视图:

setTimeout(function () {
        window.location.reload(1);
    }, 5000);

它符合我的目的......希望它可以帮助别人。

于 2015-06-01T19:23:34.340 回答
2

如果需要,这很容易破解。

第 1 步:将隐藏按钮添加到 .aspx 页面:

<asp:Button ID="btnExportUploaded" runat="server" Text="Button" style="visibility:hidden"  OnClick="btnExportUploaded_Click" CssClass="btnExportUploaded" />

第 2 步:执行您的默认回发操作,最后使用 jquery 调用注册一个启动脚本,这将触发隐藏按钮单击并导致文件下载:

ClientScriptManager cs = Page.ClientScript;
cs.RegisterStartupScript(this.GetType(), "modalstuff", "$('.btnExportUploaded').click();", true);
于 2018-09-21T19:11:29.837 回答
0

一种更简单的方法是只做事件中需要的任何PostBack事情,并注册一个带有附加参数的重新加载脚本来指示下载。就像是:

C#代码:

protected void SaveDownloadCount(int downloadId)
{
    // Run in a PostBack event. 
    // 1) Register download count, refresh page, etc.
    // 2) Register a script to reload the page with an additional parameter to indicate the download. 
    Page.ClientScript.RegisterStartupScript(GetType(), "download",
        "$(document).ready(function(){window.location.href = window.location.pathname + window.location.search ? '&' : '?' + 'printId={0}';});".Replace("{0}", downloadId.ToString()), true);
}

然后,PageLoad我们需要检查下载参数并提供文件:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            int printId;
            if (Request.QueryString["printId"] != null && int.TryParse(Request.QueryString["printId"], out printId))
            {
                // Check if the argument is valid and serve the file. 
            }
            else
            {
                // Regular initialization
            }
        }
    }

这与@puddleglum 答案相似,但没有“不同步”超时的缺点。

于 2018-12-06T12:09:07.410 回答