Скрытие загрузки изображения на постбэк asp.net для скачивания файла - PullRequest
1 голос
/ 17 ноября 2011

На моей странице asp.net есть кнопка, которая выполняет обратную передачу, создает файл Excel, очищает поток ответов и записывает файл. Затем пользователь может открыть или сохранить файл пользователя в стандартном диалоговом окне браузера.

Это прекрасно работает, я основал код на этом:

http://www.adventuresindevelopment.com/2009/05/27/how-to-export-data-to-excel-in-aspnet/

Поскольку создание файла занимает довольно много времени, я создал загрузочную панель, просто скрытый DIV, и установил ее для отображения при нажатии кнопки.

Но моя проблема в том, как скрыть этот DIV, когда экспорт завершен? Я просто не могу найти способ сделать это. Мне нужно что-то вроде события, которое срабатывает, когда файл полностью передан в браузер.

Возможно ли это? Любая помощь наиболее ценится.

Спасибо

AJ

1 Ответ

1 голос
/ 17 ноября 2011

Что бы я сделал, короткая история:

  1. Когда пользователь нажимает кнопку «Загрузить», используйте AJAX для асинхронного вызова страницы обработки.На этой странице будет сгенерирован ваш документ Excel, который будет храниться во временном местоположении

  2. Когда запрос AJAX будет выполнен, скройте панель «Загрузка» и перенаправьте пользователя на страницу загрузки.В идеале вы должны перенаправить на общий (.ashx) обработчик, который открывает файл, устанавливает некоторые заголовки, передает временный файл пользователю и впоследствии удаляет файл.

Сейчас вподробнее:

Для первого шага у вас должна быть временная папка, к которой у вас есть права на чтение и запись.Использование системной временной папки - это нормально, поэтому вы можете использовать Path.GetTempFileName.Вот пример того, что вы могли бы написать в обработчике ashx:

public class Handler1 : IHttpHandler, IRequiresSessionState
{

    public void ProcessRequest(HttpContext context)
    {
        string fName = Path.GetTempFileName();

        context.Response.ContentType = "text/plain";

        try
        {
            // Generate the Excel document
            GenerateExcelInFile(fName);

            // Store the file name in session for later use
            context.Session["ExcelGeneratorFileName"] = fName;

            // Send confirmation to the client
            context.Response.Write("ok");
        }
        catch (Exception e)
        {
            context.Response.Write("error");
            // TODO : Do some logging
        }

    }

    // SNIP : IsReusable
}

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

public class Handler2 : IHttpHandler, IRequiresSessionState
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "application/excel";

        // Make sure the browser will show a "save as" dialog to the user
        context.Response.AddHeader("content-disposition", "attachment; filename=Export.pdf");

        string fName = context.Session["ExcelGeneratorFileName"] as String;

        if (fName != null && File.Exists(fName))
        {
            // Stream the excel file to the response
            context.Response.WriteFile(fName);

            // Remove the file
            File.Delete(fName);
        }
    }

    // SNIP : IsReusable
}

Вы можете вызвать эту страницу в javascript просто используя window.location = url.Заголовок размещения контента сообщит браузеру, что этот URL-адрес не должен отображаться, только загружаться, поэтому ваш пользователь должен оставаться на странице загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...