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 檔案等。