Обычно вам не обязательно использовать какой-либо серверный язык, например 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.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 5 / 5. Количество оценок: 1

Оценок пока нет. Поставьте оценку первым.