Найти тему

Как сделать скачивание файлов с сайта

Оглавление
Как сделать скачивание файлов с сайта
Как сделать скачивание файлов с сайта

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

Сделать это абсолютно не сложно, но вы должны быть знакомы с основами таких языков как HTML и PHP.

Начнём с простого примера.

Создайте в корне сайта папку, в которой будут располагаться файлы для скачивания и назовите её, скажем,  my_content  (или по своему усмотрению). Далее создайте какой-нибудь файл - допустим, это будет архив с названием  content.zip; при этом его содержимое абсолютно не важно: просто создайте и поместите в эту папку.

Теперь откройте код какой-нибудь страницы, на которой имеется изображение и в качестве эксперимента сделайте это изображение ссылкой на созданный файл. Должно получиться примерно так:

HTML: создание изображения со ссылкой для загрузки контента
HTML: создание изображения со ссылкой для загрузки контента

где в теге <a> прописан адрес вашего файла, а в теге <img> должно быть указано ваше изображение. Так же можно использовать специально созданное изображение в виде кнопки с какой-либо надписью:

HTML: создание изображения со ссылкой для загрузки контента в виде кнопки
HTML: создание изображения со ссылкой для загрузки контента в виде кнопки

где в теге <a> точно так же, как и в предыдущем коде, прописан адрес вашего файла, а в теге <img> указано адрес изображения кнопки. Кроме того, вокруг добавляются теги <button> и </button>, создающие кнопку.

Теперь сохраните эту страницу, откройте её на сайте и кликните на изображение (кнопку): через 1-2 секунды откроется диалоговое окно с предложением установить (скачать) данный файл на компьютер.

Точно так же можно сделать ссылкой на скачивание и какой-либо текст; в любом случае браузер "поймёт", что вы хотите скачать указанный в ссылке файл и откроет диалоговое окно.

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

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

Рассмотрим эти проблемы по очереди.

Как скачивать различные типы файлов

Файлы типа .zip браузеры сразу же выводят на скачивание, а вот с другими файлами сложнее: программа будет стараться их открыть или показать; например, если кликнуть на ссылку с изображением, браузер откроет это изображение, так уж он устроен.

Возникает вопрос: как сделать, что бы браузер по таким ссылкам не открывал файлы, а сразу открывал диалоговое окно с предложением их скачать? Всё просто: укажите в ссылке атрибут download:

HTML: тег download
HTML: тег download

Теперь браузер будет понимать, что вы хотите сделать и выведет диалоговое окно.

Зачем нужно скрывать полный путь к скачиваемому файлу

Если в выше приведённом примере вы посмотрите код страницы (сочетание клавиш Ctrl+U), то увидите, что адрес скачиваемого файла лежит в открытом доступе. В некоторых браузерах вообще достаточно навести курсор на изображение и внизу сразу отразится соответствующая ссылка. Чем это плохо?

Файл, находящийся в открытом доступе, может скачать кто угодно; если вы не хотите, что бы это происходило (например, при платном скачивании), путь к файлу необходимо скрыть. Кроме того, это требование безопасности: не стоит показывать, какие папки есть на вашем сайте!

Как сделать, что бы адрес скачиваемого файла не отражался на странице

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

Рассмотрим это на примере простого компонента для CMS Joomla, ведь в данном случае тип CMS не играет никакого значения: важно понять общий принцип и слегка адаптировать код под свой сайт.

Будем считать, что папка для хранения скачиваемого контента создана, в ней находится какой-либо контент, поэтому остаётся запретить к ней доступ в файле robots.txt, находящемуся в корне сайта. Для этого в нём нужно дописать всего одну строку и сохранить внесённые изменения:

Disallow: /ваша папка/

Теперь рассмотрим принцип работы системы скачивания с защищённым адресом контента.

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

HTML: блоки со скачиваемым контентом
HTML: блоки со скачиваемым контентом

Весь блок заключён в теги <div> ... </div>. Тег <hr> рисует разделительную линию; далее идёт пояснительное изображение, так же помещённое в блок <div> ... </div>, для которого установлено обтекание по правой стороне (атрибут float); соответственно, справа от изображения располагаются название (теги <h2>...</h2>) и пояснительный текст. Под текстом расположена кнопка, которая при клике отправляет на сервер данные в виде пары имя_кнопки -> её значение ('btn_1 -> 'on'). В данном случае отправляемое значение роли не играет, важно какой кнопкой это было сделано, т.е. её имя. Не сложно догадаться, что для второго блока кнопка будет иметь имя btn_2, для третьего - btn_3 и так далее.

Надо понимать, что все блоки, естественно, находятся внутри формы, указывающей параметры отправления данных на сервер:

HTML: форма для отправки данных
HTML: форма для отправки данных

При клике на любую кнопку форма отправит на сервер соответствующие данные методом POST.  При поступлении запроса контроллер компонента перенаправит эти данные файлу обработчика формы, назовём его   ext_download.php , находящемуся в папке под названием  process (для других CMS схема может немного отличаться, но суть остаётся прежней).

Что же сделает обработчик при поступлении запроса? Рассмотрим детально его код, но для начала условимся, что на выше созданной странице существуют три кнопки - btn_1, btn_2 и btn_3, позволяющие отправить файлы с названиями  content.zip, content.pdf и content.jpg; эти файлы, соответственно, расположены в папке my_content.

PHP: файл обработчика формы
PHP: файл обработчика формы

!!! Вторая строка кода (defined...) относится исключительно к CMS Joomla!

!!! Обратите внимание: перед любыми действиями с переменными из массива $_POST необходимо проверить, была ли установлена переменная значением, отличным от null - если этого не делать, система может выдать ошибку в версиях PHP выше 7.0! Такая проверка должна проводиться перед первым использованием таких переменных в скрипте.

В начале конструкция if/elseif при помощи функции isset определяет, какая была "нажата" кнопка исходя из наличия в запросе одной из переменных $_POST['btn_1'], $_POST['btn_2'] или $_POST['btn_3'], после переменным $file и $file_type присваивается имя и тип запрашиваемого файла соответственно.

Особое внимание нужно уделить пути к файлу: из-за особенностей работы функции readfile() указать адрес в виде "чистого" URL нельзя: система просто не сработает; поэтому проще всего воспользоваться переменной $_SERVER['DOCUMENT_ROOT'] или (для CMS Joomla) JPATH_BASE.

Далее, если указанный файл существует (13 строка, file_exists($file)) передаются соответствующие заголовки header, которые дают команду браузеру создать диалоговое окно загрузки и предложить пользователю загрузить файл с определённым именем; за это отвечает строка

PHP: передача заголовков: изменение имени файла
PHP: передача заголовков: изменение имени файла

Обратите внимание: в данном случае функция basename($file) подставляет имя исходного файла. Если вы хотите его заменить, то вместо данной конструкции пропишите новое имя, но с тем же расширением.

В конце функция readfile($file) считывает исходный файл и помещает его в буфер обмена.

Так же обратите внимание на завершающую команду  exit: без неё система выдаст ошибку!

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

Доработка обработчика формы и кода блоков с информацией о скачиваемом контенте

Возможно, вы заметили, что предложенный код подходит только для сайтов с небольшим количеством скачиваемого контента, например, какой-нибудь вашей программы, книги и так далее. Проблема в том, что для каждого нового файла вам придётся каждый раз дописывать код обработчика, добавляя строки в конструкцию if/elseif, что весьма неудобно, поэтому если на вашем сайте планируется разместить довольно большое количество скачиваемого контента, то необходимо немного изменить код блоков с информацией о контенте и код обработчика формы.

Изменение кода блоков с информацией о контенте

В данном коде (смотрите выше код "HTML: блоки со скачиваемым контентом") нужно изменить аргументы в тегах <button>:

  • имена всех кнопок в форме (аргумент name) сделать одинаковыми, например, btn;
  • значения (аргумент value) для каждой кнопки сделать разными, например, btn_1, btn_2 и так далее). Зачем это нужно станет понятно позже.

!!! Здесь может возникнуть вопрос: а будет ли корректно работать скрипт с одинаковыми именами кнопок? Ответ: да, будет. Вы можете в этом убедиться, перейдя вот на эту страницу сайта: там расположены в одной форме три кнопки с одинаковыми именами, но разными значениями; при "нажатии" любой из них будет открываться страница, выводящая переданную методом POST информацию, доказывающую, что данный метод прекрасно работает.

Доработка обработчика формы

Для начала нужно создать новую таблицу в базе данных сайта, в каждой строке которой будет указано в качестве идентификатора (столбец id) значение аргумента value кнопки, а в других столбцах - название, тип файла (например, my_content.zip) и путь к нему (например, /my_content/).

!!! Далее в качестве примера будем рассматривать строку из столбцов id, name, type, path - идентификатор, имя файла, тип и путь к файлу (строго в указанном порядке).

При запросе к БД обработчик будет использовать данные, полученные из переменной $_POST['btn']: это переданное на сервер значение аргумента value кнопки, по которому и будет идентифицироваться в столбце id запрашиваемая строка.

Конструкцию if/elseif в обработчике следует убрать, заменив её на код запроса к БД. Ниже рассмотрим пример кода для CMS Joomla; для других CMS это может выглядеть немного иначе, но здесь важно понять смысл происходящего и адаптировать код к своему "движку".

В начале нужно выяснить, какую кнопку "нажал" пользователь; это значение, как уже было сказано выше, находится в переменной $_POST['btn']:

Получение данных (значения аргумента value кнопки)
Получение данных (значения аргумента value кнопки)

Теперь нужно подключиться к базе данных:

Joomla: подключение к базе данных
Joomla: подключение к базе данных

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

Далее создаётся запрос к БД и обрабатывается ответ:

PHP, Joomla: запрос к базе данных
PHP, Joomla: запрос к базе данных

Команда select указывает, что в ответе должна быть вся запрашиваемая строка, from указывает название таблицы, where указывает на нужную строку, где 'id' это указание на столбец, по которому нужно определять строку, а $value - искомое значение в данном столбце (идентификатор).

Ниже следует команда на запрос к БД ($db->setQuery($query)), последняя строка получает ответ в виде массива с запрошенной информацией ($result=$db->loadRow()).

Теперь осталось подставить необходимые данные из массива в переменные $file и $file_type и дописать заголовки, как это было сделано в начальной версии:

PHP: обработчик запроса для больших объёмов загрузок
PHP: обработчик запроса для больших объёмов загрузок

В данном коде первые три строки получают необходимые данные из массива строки БД, четвёртая строка составляет полный путь к файлу и далее подготавливаются соответствующие заголовки. Не забудьте, что вы можете изменить подставляемое в диалоговом окне имя файла на другое (см. выше код "PHP: передача заголовков; изменение имени файла").

В последних двух строках, как и в предыдущем варианте, считывается исходный файл, помещается в буфер обмена, после чего следует закрывающая команда.

!!! Не забудьте, что без функции exit система будет выдавать ошибку!

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

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

Анонс: К публикации готовится статья "Как сделать платное скачивание файлов с сайта".

Подписывайтесь на наш канал, следите за публикациями!

#web development school #скачивание с сайта #скачивание файлов #как сделать скачивание #скачиваемый контент