Это две части:
- Заставить браузер загрузить файл, а не пытаться его отобразить (с .exe это не проблема, но вы можете захотеть сделать это с изображением, фильмом или HTML-файлом тоже).
- Запрос браузера загрузить файл.
Давайте представим, что мы просто хотим, чтобы браузер загружал файл, не желая менять страницу. Мы можем создать такую ссылку, и она будет работать как положено:
<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 секунды, а затем попытаться загрузить изображение. Он получит заголовки, которые мы установили на последнем шаге, и загрузит его вместо его отображения, и пользователь останется на странице так, как мы хотим.