2011-02-07 3 views
6

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

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

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

Я могу начать загрузку в сообщении, но мой Gridview не обновляется до его начала, поэтому он не отображает самый новый запрос в списке. Как я могу получить 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 в качестве последнего пункта, если скрытое поле установлено верно (который я поставил, когда они кликают кнопку для создания файла).

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

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

ответ

2

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

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

  • включают meta refresh тег на странице
  • использовать OnLoad JavaScript
  • использовать IFRAME
  • ... или у пользователя нажать на ссылку, как вы сказали ,

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

+0

Я создал ссылку для загрузки в gridview, поэтому, если она не запускается сама по себе или они по ошибке отменяются, они все равно могут загрузить файл, так как он хранится на сервере. Спасибо за предложения, я обязательно посмотрю на них и посмотрю, что лучше всего работает. – Delebrin

1

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

+0

Я согласен, что я, вероятно, слишком много делаю сразу. Спасибо за предложение, я посмотрю, что все, что я могу сделать, а затем выбрать решение здесь для того, что работает лучше всего! – Delebrin

3

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

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

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

+0

Я изучал javascript подход с таймером раньше, но я не пробовал просто отправлять функцию напрямую, только когда это необходимо. Я проверю этот вариант. Спасибо за предложение! – Delebrin

Смежные вопросы