Как вы обслуживаете файл, не покидая страницу? - PullRequest
13 голосов
/ 03 марта 2009

Цели

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

Мне нужно, чтобы это работало во всех браузерах (IE6-8, Firefox, Chrome, Opera, Safari).

Фон

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

Ответы [ 6 ]

12 голосов
/ 03 марта 2009

Добавьте следующий заголовок при загрузке файла загрузки:

Content-disposition: attachment; filename=filename.zip

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

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

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

3 голосов
/ 05 апреля 2009

Чтобы не покидать страницу (если вы это сделаете, страница сначала пытается закрыть себя, чтобы быть уверенным, что вы сохранили все, и вы получите предупреждающие сообщения, если вы этого не сделали) или оставить пустые вкладки (которые я не нравится, ни использование устаревшего целевого атрибута) Я использовал iframe, чей атрибут src изменен в javascript.

Это работает везде, кроме некоторых версий Opera, которые я посчитал приемлемой потерей (я мог бы исправить это с помощью одного из других решений и обнаружения браузера позже).

3 голосов
/ 03 марта 2009

Если вы сделаете ссылку открытой в новом окне / вкладке (например, через атрибут target="_blank" тега <a>), это не повлияет на содержимое текущего окна.

Атрибут target устарел , но широко поддерживается. В зависимости от браузера вы также можете использовать свойство CSS3 target-name .

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

0 голосов
/ 03 марта 2009

Кстати, указание соответствующего заголовка расположения контента может работать не во всех браузерах. В частности, я видел, что он не работает в Opera, и IE7 отображает желтую полосу предупреждения безопасности.

В дополнение к соответствующему заголовку, как описано thomasrutter, я сделал это, используя скрытую форму:

<form id="download_form" method="get" action=""></form>

Когда пользователь нажимает кнопку, вы можете манипулировать атрибутом «action» формы с помощью URL-адреса файла.

Кажется, это работает во всех браузерах, даже в IE7!

0 голосов
/ 03 марта 2009

Мы делаем это при обратной передаче на странице aspx, устанавливая ContentType в значение «application / octet-stream», затем направляя поток в zip-файл с помощью Response.BinaryWrite (..) и Response.Flush ().

Дает пользователю всплывающее окно "Вы хотите открыть или сохранить" файл.

Страница все еще доступна.

0 голосов
/ 03 марта 2009

Я полагаю, что если вы направите пользователя к файлу, а тип MIME - это то, что браузер знает, что он должен загрузить, а не рендер, браузер не покинет страницу. Например, если вы обслуживаете zip-файл, браузер узнает, что это zip-файл, и запросит загрузку. Но если вы собираетесь обслуживать zip-файл из запроса страницы (т.е. /file.aspx?file=myinfo.zip), то file.aspx потребуется изменить тип MIME на «application / zip», прежде чем отправлять ответ для того, чтобы предложить пользователю для загрузки.

Одно важное предостережение: если по какой-то причине файл не существует, пользователь получит 404 и будет перенаправлен на страницу ошибки.

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

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