Инициирование загрузки файла, которое работает хорошо, даже в IE? - PullRequest
7 голосов
/ 08 апреля 2009

Мне нужны еще мысли о том, как лучше всего начать загрузку файлов из Javascript.

Лучший способ начать загрузку? имеет много хороших идей, которые можно обобщить:

  • Установить SRC на iframe
  • Использовать window.location.replace ()
  • Использовать страницу с заголовком метаобновления
  • Использовать window.open ()
  • Позволяет серверу напрямую выводить файл, устанавливая Content-Type и Content-Disposition

Все эти подходы прекрасно работают для браузеров, с которыми я тестировал, за исключением IE8. С IE8 у меня куча проблем:

  • iframe не работает из-за файлов cookie, установленных в среде, которую я использую. Я думаю, что мне нужно включить заголовки P3P, чтобы решить эту проблему, но среда не позволяет мне устанавливать заголовки, поэтому P3P отсутствует
  • window.location.replace () работает, за исключением того, что в IE8 адресная строка окна изменяется на URL-адрес файла, а базовое окно остается пустым после открытия загруженного файла
  • Подход мета-обновления также работает, но адресная строка по-прежнему меняется на URL-адрес файла, и в базовом окне пустое значение после загрузки файла
  • Я отчаянно пытаюсь избежать window.open (), чтобы уклоняться от любых проблем с блокировщиком всплывающих окон
  • Серверная среда, в которой я нахожусь, не позволит вам вывести сам файл, как вы могли бы, скажем, сделать объект ответа ASP.NET

Я даже не пробовал эти методы с IE6 или IE7, поэтому там могут быть другие сюрпризы.

Так же у кого-нибудь есть другие предложения для начала загрузки в IE, где (1) нет всплывающих окон и (2) файл может быть сохранен или открыт и (3) не осталось пустое окно, (3) используя только Javascript, HTML и URL для файла?

Денвер Майк

1 Ответ

5 голосов
/ 08 апреля 2009

Обычный шаблон для страницы файла загрузки (если она у вас есть; лично я их ненавижу):

<script type="text/javascript">
    window.onload= function() {
        window.location= document.getElementById('downloadlink').href;
    }
</script>
<p>
    Your download will begin shortly. If it doesn't,
    <a id="downloadlink" href="file.zip">click here</a>.
</p>

Или то же самое с мета-обновлением вместо сценария. Любой способ должен вести себя примерно одинаково.

Подход мета-обновления также работает, но адресная строка по-прежнему меняется на URL-адрес файла, и основное окно остается пустым после загрузки файла

Этого не должно быть. Есть ли онлайн версия, которую можно протестировать? Обычно, когда браузер принудительно загружает файл любым обычным способом (щелчок по ссылке, location.href, meta-refresh), он должен сохранять предыдущую страницу на экране.

среда не позволяет мне устанавливать заголовки, поэтому P3P отсутствует

Вам не нужно использовать заголовки для установки политик P3P, тег HTML работает так же хорошо:

<link rel="P3Pv1" href="/policy.p3p" />

Но зачем вам это нужно? Если целевой URL-адрес просто служит для файла, устанавливать куки-файл вообще не нужно, так зачем использовать P3P?

Я отчаянно пытаюсь избежать window.open (), чтобы избежать проблем с блокировщиком всплывающих окон

Если вы откроете window.open () в ответ на щелчок пользователя, проблем с блокировщиком всплывающих окон нет.

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

Единственная обычная проблема, связанная с простой ссылкой на файл, заключается в том, что если он содержит текст, HTML, XML или изображение, браузер будет отображать его встроенным, а не загружать. Единственный способ победить это - использовать заголовок «Content-Disposition: attachment», либо отправив его через скрипт, который устанавливает этот заголовок, либо сконфигурировав веб-сервер для отправки этого заголовка для всех загрузок файлов. Если вы не можете выполнить ни одного из этих действий в своей серверной среде, решения не существует.

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