ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Как скачать файл на PHP

Как скачать файл на PHP

Как правило, для загрузки файла с расширениями exe и zip не требуется PHP-скрипт. Если местоположение файла этого типа файла задано в атрибуте href элемента привязки, то файл автоматически загружается, когда пользователь щелкает ссылку для загрузки. Некоторые файлы, такие как файлы изображений, файлы PDF, текстовые файлы, файлы CSV и т. Д., не загружаются автоматически, а вместо этого открываются в браузере, когда пользователь щелкает ссылку для загрузки. Эти файлы можно принудительно загрузить в PHP с помощью функции readfile(), которая не загружается автоматически. В этой статье показано, как принудительно загрузить любой файл с помощью сценария PHP.

 

Проверить ссылки для скачивания

Ранее упоминалось, что файлы zip и exe загружаются автоматически, без использования сценария PHP. Сначала создайте HTML-файл со следующим кодом. Здесь четыре элемента привязки определены для загрузки файлов четырех типов. Эти типы файлов включают файлы TEXT, ZIP, PDF и JPG.

Download.html

<html>
<head>
<title>Скачивать файлы</title>
</head>
<body>
<p><a href="abc.txt">Скачать файл TEXT</a></p>
<p><a href="horizon.zip">Скачать файл ZIP</a></p>
<p><a href="lecture.pdf">Скачать файл PDF</a></p>
<p><a href="rose.jpg">Скачать файл JPG</a></p>
</body>
</html>

Выходные данные

После нажатия ссылки на zip-файл появится следующее диалоговое окно для загрузки файла. Затем пользователь может загрузить файл или открыть файл в диспетчере архивов.

Если вы щелкните файл изображения, оно автоматически откроется в браузере, как показано в следующем выводе. Вы должны сохранить файл, чтобы сделать копию файла образа на локальном диске. Таким же образом, когда вы нажимаете ссылки на файлы PDF и TEXT, содержимое файла открывается в браузере без загрузки файла. Решение этой проблемы – принудительно загрузить файл с помощью встроенной функции PHP readfile().

 

Загрузить файл с помощью функции readfile()

Функция readfile() используется в сценарии PHP для принудительной загрузки любого файла из текущего местоположения или файла с путем к файлу. Синтаксис этой функции приведен ниже.

Синтаксис

int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] )

 

Эта функция может принимать три аргумента. Первый аргумент является обязательным, а два других аргумента – необязательными. Первый аргумент, $filename, хранит имя файла или имя файла с путем, который будет загружен. Значение по умолчанию второго параметра, $use_include_path, равно false и будет установлено в true, если имя файла с путем используется в первом аргументе. Третий аргумент, $context, используется для указания ресурса потока контекста. Эта функция возвращает количество байтов, прочитанных из файла, указанного в первом аргументе. Использование этой функции показано в следующих двух примерах.

 

Пример 1: Загрузить файл с именем файла

В этом примере мы создадим HTML-файл со следующим кодом, в котором имя файла будет передано в качестве параметра URL-адреса с именем path, а значение этого параметра будет передано в файл PHP с именем download.php.

download2.html

<html>
<head>
<title>Скачивать файлы</title>
</head>
<body>
<p><a href="download.php?path=abc.txt">Скачать файл TEXT</a></p>
<p><a href="download.php?path=horizon.zip">Скачать файл ZIP</a></p>
<p><a href="download.php?path=lecture.pdf">Скачать файл PDF</a></p>
<p><a href="download.php?path=rose.jpg">Скачать файл JPG</a></p>
</body>
</html>

 

Мы создадим файл PHP со следующим кодом для принудительной загрузки файла. Здесь функция isset() используется для проверки, определен ли $_GET [‘path’]. Если переменная определена, функция file_exists() используется для проверки, существует ли файл на сервере. Затем функция header() используется для установки необходимой информации заголовка перед использованием функции readfile(). Функция basename() используется для получения имени файла, а функция sizes() используется для чтения размера файла в байтах, который будет показан в открывшемся диалоговом окне для загрузки файла. функция  flush()используется для очистки буфера вывода. Здесь функция readfile() используется только с именем файла.

download.php

<?php

if(isset($_GET['path']))
{
//Читать файл
$filename = $_GET['path'];
//Проверка на существование файла
if(file_exists($filename)) {

//Определение информации заголовка
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Cache-Control: no-cache, must-revalidate");
header("Expires: 0");
header('Content-Disposition: attachment; filename="'.basename($filename).'"');
header('Content-Length: '. filesize($filename));
header('Pragma: public');

//Очистить выходной буфер системы
flush();

//Считайте размер файла
readfile($filename);

//Завершить работу со скриптом
die();
}
else{
echo "Файл не существует.";
}
}
else
echo "Имя файла не определено."
?>

 

Выходные данные

Выходные данные появятся после щелчка по ссылке для загрузки файла изображения. Размер файла изображения rose.jpg составляет 27,2 КБ, как показано в диалоговом окне. Вы можете загрузить файл, установив переключатель «Сохранить файл» и нажав кнопку OK.

 

Пример 2: Загрузить файл с указанием пути к файлу

Если файл существует в указанном месте, путь к файлу необходимо указать в URL-адресе. В этом примере мы создадим HTML-файл со следующим кодом, который будет передавать имя файла с путем к файлу:

download3.html

<html>
<head>
<title>Скачать файлы</title>
</head>
<body>
<p><a href="download.php?path=downloads/lecture.pdf">Скачать PDF file</a></p>
<p><a href="download2.php?path=downloads/rose.jpg">Скачать JPG file</a></p>
</body>
</html>

Мы создадим файл PHP со следующим кодом, чтобы загрузить файл по пути к файлу. Код PHP в предыдущем примере будет немного изменен для загрузки файла по заданному пути. Функция clearstatecache() используется для очистки кеша, который был ранее сохранен. В функции readfile() используются два аргумента.

download2.php

<?php
if(isset($_GET['path']))
{
//Читать url
$url = $_GET['path'];//Очистить кэш
clearstatcache();

//Проверьте, существует ли путь к файлу или нет
if(file_exists($url)) {

//Определение информации заголовка
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($url).'"');
header('Content-Length: '. filesize($url));
header('Pragma: public');

//Очистить выходной буфер системы
flush();

//Считайте размер файла
readfile($url,true);

//Завершить работу со скриптом
die();
}
else{
echo "Путь к файлу не существует.";
}
}
echo "Путь к файлу не определен."

?>

 

Вывод

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

Exit mobile version