Подтвердить что ты не робот

Как вы обслуживаете файл, не выходя из страницы?

Цели

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

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

Фон

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Content-disposition: attachment; filename=filename.zip

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Страница по-прежнему доступна.

Ответ 6

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

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

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

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

Это похоже на работу во всех браузерах, даже в IE7!