Update page after file download
Asked Answered
L

4

13

I put together a download script after some wonderful help from stack overflow the other day. However I have now found that after the file has been downloaded I need to reload the page to get rid of the progress template on the aspx page. The code to remove the template worked before I added in the download code.

Code to remove progress template: upFinanceMasterScreen.Update();

I've tried calling putting this before and after the redirect to the 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; } } 

Thanks for any help you can provide!

Ledbetter answered 26/10, 2010 at 15:34 Comment(0)
E
36

When you send back a file for the user to download, that is the HTTP request. In other words, you can either have a post-back which refreshes the browser page or you can send a file for the user to download. You cannot do both without special tricks.

This is why most sites when you download a file, it first takes you to a new page that says, "Your download is about to begin", and then subsequently "redirects" you to the file to download using meta-refresh or javascript.

For example, when you go here to download the .NET 4 runtime:

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

It renders the page, then uses the following meta-refresh tag to actually give the user the file to download:

<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" />

You'll probably have to do something similar in your app. However, if you are truly interested in doing something after the file is completely downloaded, you're out of luck, as there's no event to communicate that to the browser. The only way to do that is an AJAX upload like gmail uses when you upload an attachment.

Entangle answered 26/10, 2010 at 15:51 Comment(2)
Thank you! I didn't think it was possable but just thought I would ask.Ledbetter
As you cannot have both at the same page, why not do it using two pages! My approach is to update and then pop up another page (using JavaScript windows.open()) to handle the download. You may wish to check out Page.ClientScript.RegisterStartupScript. Hope this helps others.Reorder
B
10

In my case, I was using MVC and I just wanted the page to refresh a few seconds after the download button was selected in order to show the new download count. I was returning the file from the controller.

To do this I simply changed the view by adding an onclick event to the download button that called the following script (also in the view):

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

It fit my purpose... hope it helps someone else.

Barrator answered 1/6, 2015 at 19:23 Comment(2)
Nice workaround, saved me a headache. Not a fancy solution and may present an issue if the delay value set is less than the time it takes for the download but it does work even with ASP.NET webform controls.Elicia
In this case, if the server takes more than 5 seconds to process your request then maybe your file will not be download.Rad
A
2

This is quick and easy to hack if needed.

Step 1: Add hidden button to .aspx page:

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

Step 2: Perform your default postback action and at the end register a startup script with jquery call which will trigger the hidden button click and cause a file to download:

ClientScriptManager cs = Page.ClientScript;
cs.RegisterStartupScript(this.GetType(), "modalstuff", "$('.btnExportUploaded').click();", true);
Alderson answered 21/9, 2018 at 19:11 Comment(0)
C
0

A simpler approach is to just do whatever needed in the PostBack event, and register a reload script with an additional argument to indicate the download. Something like:

C# code:

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

Then, in PageLoad we need to check for the download paramenter and serve the file:

    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
            }
        }
    }

This is simalar to @puddleglum answer but without the drawback of the "out of synch" timeout.

Chantry answered 6/12, 2018 at 12:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.