Обычно вам не обязательно использовать какой-либо серверный язык, например PHP, для загрузки изображений, zip-файлов, PDF-документов, exe-файлов и т. д. Если такой тип файла хранится в общедоступной папке, вы можете просто создать гиперссылку, указывающую на этот файл, и всякий раз, когда пользователь будет кликать на ссылку, браузер будет автоматически загружать этот файл.
<a href="downloads/test.zip">Download Zip file</a>
<a href="downloads/masters.pdf">Download PDF file</a>
<a href="downloads/sample.jpg">Download Image file</a>
<a href="downloads/setup.exe">Download EXE file</a>
Щелчок по ссылке, указывающей на PDF-файл или файл с изображением, не приведет к его загрузке на ваш жесткий диск напрямую. Он откроет файл только в вашем браузере. В дальнейшем вы можете сохранить его на свой жесткий диск. Однако по умолчанию файлы .zip
и .exe
загружаются на жесткий диск автоматически.
Принудительная загрузка с помощью PHP-функции readfile()
Вы можете заставить изображения или другие файлы загружаться непосредственно на жесткий диск пользователя с помощью PHP-функции readfile()
. Здесь мы собираемся создать простую галерею изображений, которая позволяет пользователям загружать файлы изображений из браузера одним щелчком мыши.
Давайте создадим файл с именем image-gallery.php
и поместим в него следующий код.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Simple Image Gallery</title>
<style type="text/css">
.img-box{
display: inline-block;
text-align: center;
margin: 0 15px;
}
</style>
</head>
<body>
<?php
// Массив, содержащий имена файлов изображений
$images = array("kites.jpg", "balloons.jpg");
// Запускаем цикл массива изображений
foreach($images as $image){
echo '<div class="img-box">';
echo '<img src="images/' . $image . '" width="200" alt="' . pathinfo($image, PATHINFO_FILENAME) .'">';
echo '<p><a href="download.php?file=' . urlencode($image) . '">Загрузить</a></p>';
echo '</div>';
}
?>
</body>
</html>
Если вы внимательно посмотрите на приведенный выше пример кода, вы обнаружите, что ссылка для скачивания указывает на файл download.php
, URL также содержит имя файла изображения в виде строки запроса. Кроме того, мы использовали PHP-функцию urlencode()
для кодирования имен файлов изображений, чтобы их можно было безопасно передать как параметр URL, поскольку имена файлов могут содержать небезопасные символы URL.
Вот полный код файла download.php
, который принудительно загружает изображение.
<?php
if(isset($_REQUEST["file"])){
// Получаем параметры
$file = urldecode($_REQUEST["file"]); // Декодируем строку в кодировке URL
/* Проверяем, содержит ли имя файла недопустимые символы
например "../" с использованием регулярного выражения */
if(preg_match('/^[^.][-a-z0-9_.]+[a-z]$/i', $file)){
$filepath = "images/" . $file;
// Процесс загрузки
if(file_exists($filepath)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($filepath).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filepath));
flush(); // Flush system output buffer
readfile($filepath);
die();
} else {
http_response_code(404);
die();
}
} else {
die("Invalid file name!");
}
}
?>
Точно так же вы можете принудительно загрузить файлы других форматов, такие как word .doc
, .pdf
и т. д.
Регулярное выражение в приведенном выше примере (строка № 8) просто не разрешит те файлы, имя которых начинается или заканчивается символом точки (.
), Например, оно разрешает имена файлов, такие как kites.jpg
или Kites.jpg
, myscript.min.js
, но не разрешает kites.jpg.
или .kites.jpg
.
Подробнее см. Руководство по регулярным выражениям в PHP.