English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHP базовый учебник

PHP продвинутый учебник

PHP & MySQL

PHP справочник

Скачать файл PHP

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

Загрузка файлов с помощью PHP

Обычно, вам не обязательно использовать任何 серверный скриптовый язык (например, PHP) для загрузки изображений, zip-файлов, pdf-документов, exe-файлов и т.д. Если такие файлы хранятся в общедоступной папке, достаточно создать ссылку на этот файл, и каждый раз, когда пользователь нажимает на ссылку, браузер автоматически загружает файл.

<a href="downloads/test.zip">загрузить файл Zip</a>
<a href="downloads/masters.pdf">загрузить файл PDF</a>
<a href="downloads/sample.jpg">загрузить файл изображения</a>
<a href="downloads/setup.exe">下载EXE文件</a>

单击指向PDF或图像文件的链接不会导致其直接下载到硬盘驱动器。它将仅在浏览器中打开文件。此外,您可以将其保存到硬盘中。但是,默认情况下,zip和exe文件会自动下载到硬盘驱动器。

使用PHP强制下载

您可以使用PHP readfile()函数强制将图像或其他类型的文件直接下载到用户的硬盘上。在这里,我们将创建一个简单的图像库,允许用户单击鼠标从浏览器下载图像文件。

让我们创建一个名为“image-gallery.php”的文件,并将以下代码放入其中。

<!DOCTYPE html>
<html>
<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>
    <?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.html?file=' . urlencode($image) . '">下载</a></p>';
        echo '</div>';
    }
    ?>
</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(); // Чистка системного буфера вывода
            readfile($filepath);
            die();
        } else {
            http_response_code(404);
	        die();
        }
    } else {
        die("Неправильное имя файла!");
    }
}
?>

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

как показано в примере (строка 8)включая регулярные выражения, которые полностью не позволяют использовать имена файлов, начинающиеся или заканчивающиеся точкой (.), например, это позволяет использовать имена файлов kites.jpg или Kites.jpg, myscript.min.js и т.д., но не позволяет использовать kites.jpg. или .kites.jpg.

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