Как правило, для загрузки файла с расширениями 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, чтобы помочь читателям добавить функцию загрузки в свой сценарий.