Вопрос

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

Спасибо за любую помощь, которую вы можете предоставить!

Это было полезно?

Решение

Когда вы отправляете файл для того, чтобы пользователь загрузить, тот это запрос HTTP. Другими словами, вы можете либо есть пост-обратно, который обновляет страницу браузера или Вы можете отправить файл для загрузки пользователя. Вы не можете сделать оба без особых трюков.

Вот почему большинство сайтов, когда вы загружаете файл, это первый Занимает вас на новую страницу, которая говорит: «Ваша загрузка собирается начать», а затем впоследствии «перенаправлять» вас к файлу для загрузки с помощью META-Refresh или JavaScript.

Например, когда вы идете сюда, чтобы загрузить время выполнения .NET 4:

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

Он отображает страницу, затем использует следующий метку Meta-Refreght, чтобы фактически предоставить пользователю файл для загрузки:

<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, когда вы загружаете вложение.

Другие советы

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

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

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

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

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

Шаг 1: Добавьте скрытую кнопку на страницу .aspx:

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

Шаг 2: Выполните действие отспуска по умолчанию и в конце регистрации скрипта запуска с вызовом jQuery, который будет запускать кнопку HIDDEN, нажмите и привести к загрузке файла:

ClientScriptManager cs = Page.ClientScript;
cs.RegisterStartupScript(this.GetType(), "modalstuff", "$('.btnExportUploaded').click();", true);

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

Это Simalar для ответа @PuddleGlum, но без недостатка тайм-аута «из синхронизации».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top