Начать загрузку файла после обратной передачи - PullRequest
6 голосов
/ 07 февраля 2011

В моем приложении я создаю zip-файл для пользователя, чтобы загрузить некоторые экспортированные данные базы данных. Zip-файл создается, когда пользователь нажимает кнопку «Создать данные», и я регистрирую запрос в базе данных.

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

Проблема, с которой я сталкиваюсь, заключается в том, что когда они нажимают кнопку, я бы хотел, чтобы страница обновилась (таким образом, обновив представление сетки и показав их последний запрос), а затем начала загрузку файла для них (IE, вызовите подсказку и пусть они решат, открывать ли / сохранять / отменять его).

Я могу начать загрузку с поста назад, но мой Gridview не обновляется до его начала, поэтому он не отображает самый новый запрос в списке. Как я могу получить сетку для обновления ДО начала загрузки?

Я использую следующее, чтобы начать загрузку:

    public void BeginDownload()
    {
        FileDownload download = InventoryService.GetLastThreeFileDownloads(this.EmployeeId).First();
        FileInfo fi = new FileInfo(Server.MapPath(SERVER_DOWNLOAD_PATH) + download.DownloadFileName);

        Response.Clear();
        Response.ContentType = "application/zip";
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + fi.Name);
        Response.TransmitFile(fi.FullName);
        Response.Flush();
    }

Метод вызывается в событии Page_Load как последний элемент, если для скрытого поля установлено значение true (которое я устанавливаю, когда они нажимают кнопку для создания файла).

Я также пытался сделать это с помощью вызовов jQuery / AJAX, чтобы либо обновить страницу, и начать загрузку с небольшим успехом. Я думал о том, чтобы открыть модальное диалоговое окно и позволить им щелкнуть ссылку, чтобы начать загрузку, а затем обновить страницу, когда модальное окно закрывается, но это последнее средство, если я не могу найти другое решение.

Любая помощь очень ценится!

Ответы [ 3 ]

3 голосов
/ 07 февраля 2011

Вот как я сделал нечто подобное некоторое время назад:

  1. При обратной передаче (генерация данных) отправьте обратно обновленную страницу с самыми новыми данными в виде сетки.
  2. Добавьте небольшойФункция javascript, которая выполняется после завершения загрузки страницы и запрашивает сгенерированный файл (что-то вроде window.location='fileurl';. Конечно, отправлять эту функцию javascript можно только при обратной передаче.

Содержимое отображаемой страницы не изменяетсяпри запросе файла он просто откроет диалоговое окно сохранения вашего браузера.

2 голосов
/ 07 февраля 2011

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

Здесь есть различные варианты:

  • включает метаобновление тег на странице
  • использовать загружаемый JavaScript
  • используйте iframe
  • … или попросите пользователя щелкнуть ссылку, как вы сказали.

У всех методов есть свои недостатки (будьте осторожны, особенно в том, что касается защиты IE от «нежелательной загрузки», которая при некоторых обстоятельствах может раздражать), вам следует, по крайней мере, включить ссылку для загрузки со словами «если загрузка не начинается автоматически нажмите здесь ».)

1 голос
/ 07 февраля 2011

Похоже, вы пытаетесь сделать слишком много одновременно.Я предлагаю отправить обратно, чтобы обновить gridview, а затем использовать перенаправление на новую, выделенную страницу (или обработчик ashx), чтобы загрузить файл.Страница вида сетки должна оставаться видимой при использовании заголовка расположения содержимого в обработчике страницы загрузки / ashx.

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