Стандартный способ сделать "thanks_for_downloading.html" + "Сохранить файл ..." после ссылки? - PullRequest
1 голос
/ 09 февраля 2011

Давайте посмотрим на FireFox.

У них есть приятная большая кнопка «Призыв к действию»: «Firefox 3.6 - Бесплатная загрузка»

Вы нажимаете эту ссылку, и вы переходите на новую страницу: «Спасибо за загрузку Firefox!начнется через несколько секунд. "

Затем через несколько секунд появится всплывающее окно:" FIREFOX.exe - Вы хотите сохранить или удалить этот файл? "

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

Ответы [ 3 ]

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

Это две части:

  1. Заставить браузер загрузить файл, а не пытаться его отобразить (с .exe это не проблема, но вы можете захотеть сделать это с изображением, фильмом или HTML-файлом тоже).
  2. Запрос браузера загрузить файл.

Давайте представим, что мы просто хотим, чтобы браузер загружал файл, не желая менять страницу. Мы можем создать такую ​​ссылку, и она будет работать как положено:

<a href="/download.zip">Download File</a>

Ваш браузер, вероятно, не знает, как обрабатывать zip-файл, поэтому он загружает файл "download.zip" прямо в файл, названный в честь имени файла в URL. Однако если вы хотите загрузить JPG, это не сработает:

<a href="/images/sunset.jpg">Save this Sunset!</a>

Ваш браузер знает, как отображать JPEG, поэтому он перенаправляет страницу и показывает JPEG. Теперь нам нужно сказать браузеру не показывать его, а вместо этого загрузить его. Чтобы сделать это, мы должны отправить ему несколько конкретных заголовков HTTP в ответе с сервера.

Apache может справиться с этим, указав заголовки в .htaccess, но я буду держаться подальше от конкретной технологии, решив просто поговорить о механизме.

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

Content-disposition: attachment; filename=the_sunset_of_a_lifetime.jpg;

Первый заголовок, content-disposition, сообщает вашему браузеру, что мы хотим, чтобы файл был вложением, или, другими словами, он должен быть сохранен, а не отображен. Атрибут filename сообщает ему имя, используемое для сохранения файла (вместо «sunset.jpg» файл будет называться «the_sunset_of_a_lifetime.jpg»).

Теперь ссылка на скачивание файла sunset.jpg работает так, как мы хотим. Но как заставить браузер загружать его, не нажимая на ссылку, чтобы мы могли показать страницу «Спасибо» и предложить начать загрузку? Простой тэг <meta> может помочь, говоря браузеру перенаправить страницу через заданный промежуток времени:

<meta http-equiv="refresh" content="2;url=/images/sunset.jpg">

Когда ваша страница "спасибо" загружается с этим метатегом в head, она будет ждать 2 секунды, а затем попытаться загрузить изображение. Он получит заголовки, которые мы установили на последнем шаге, и загрузит его вместо его отображения, и пользователь останется на странице так, как мы хотим.

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

Пример содержимого thanks_for_downloading.html:

<strong>Thanks for downloading XY</strong>

<script type="text/javascript">
window.onload = function(){
    window.location.href = "path/to/XY.exe";
};
</script>

Ссылка для скачивания - это просто ссылка на страницу thanks_for_downloading.html

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

Кнопка призыва к действию - это обычная ссылка на страницу «Спасибо».Затем на странице «Спасибо» используйте javascript, чтобы перенаправить пользователя к загружаемому файлу, задав для свойства «window.location» URL-адрес файла.

...