Обновить страницу после загрузки файла - PullRequest
11 голосов
/ 26 октября 2010

Я собрал скрипт загрузки после некоторой замечательной помощи от переполнения стека на днях.Однако теперь я обнаружил, что после загрузки файла мне нужно перезагрузить страницу, чтобы избавиться от шаблона прогресса на странице 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 ]

28 голосов
/ 26 октября 2010

Когда вы отправляете обратно файл для загрузки пользователем, , что - это 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" />

Возможно, вам придется сделать что-то подобное в вашем приложении.Однако, если вы действительно заинтересованы в том, чтобы что-то сделать после , файл полностью загружен, вам не повезло, так как нет события, чтобы сообщить об этом браузеру.Единственный способ сделать это - AJAX-загрузка , как в gmail, когда вы загружаете вложение.

6 голосов
/ 01 июня 2015

В моем случае я использовал MVC и просто хотел, чтобы страница обновлялась через несколько секунд после нажатия кнопки загрузки, чтобы отобразить новый счетчик загрузок. Я возвращал файл с контроллера.

Для этого я просто изменил представление, добавив событие onclick к кнопке загрузки, которая вызвала следующий скрипт (также в представлении):

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

Это соответствует моей цели ... надеюсь, это поможет кому-то еще.

1 голос
/ 21 сентября 2018

Это быстро и легко взломать при необходимости.

Шаг 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);
0 голосов
/ 06 декабря 2018

Более простой подход состоит в том, чтобы просто сделать все необходимое в событии 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
            }
        }
    }

Thisявляется символом ответа @puddleglum, но без недостатка тайм-аута "не синхронизировано".

...