PHP 文件下载

在本教程中,你将学习如何使用 PHP 强制下载文件。

使用 PHP 下载文件

通常,你不一定需要使用任何服务器端脚本语言(如 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 或图像文件的链接不会导致它直接下载到你的硬盘驱动器。它只会在浏览器中打开文件。此外,你可以将其保存到你的硬盘驱动器。但是,默认情况下,zipexe 文件会自动下载到硬盘驱动器。

使用 PHP 强制下载

你可以使用 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
    // Array containing sample image file names
    $images = array("kites.jpg", "balloons.jpg");
    
    // Loop through array to create image gallery
    foreach($images as $image){
        echo '';
            echo '<img src="images/' . $image . '" width="200" alt="' .  pathinfo($image, PATHINFO_FILENAME) .'">';
            echo '<p><a href="download.php?file=' . urlencode($image) . '">Download</a></p>';
        echo '';
    }
    ?>
</body>
</html>

如果你仔细看到上面的示例代码,你会发现下载链接指向 download.php 文件,URL 也包含图像文件名作为查询字符串。此外,我们使用 PHP urlencode() 函数对图像文件名进行编码,以便可以安全地将其作为 URL 参数传递,因为文件名可能包含 URL 不安全字符。

这是 download.php 文件的完整代码,它强制图像下载。

<?php
if(isset($_REQUEST["file"])){
    // Get parameters
    $file = urldecode($_REQUEST["file"]); // Decode URL-encoded string
    $filepath = "images/" . $file;
    
    // Process download
    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);
        exit;
    }
}
?>

同样,你可以强制下载其他文件格式,如 Word 文件,pdf 文件等。