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

Tutorial di base PHP

Tutorial avanzato PHP

PHP & MySQL

Manuale di riferimento PHP

Download dei file PHP

In questo tutorial, imparerai come forzare il download di file utilizzando PHP.

Scaricare file con PHP

Di solito, non è necessario utilizzare alcun linguaggio di script server-side (ad esempio PHP) per scaricare immagini, file ZIP, documenti PDF, file EXE ecc. Se tali file sono memorizzati in una cartella accessibile pubblicamente, è sufficiente creare un collegamento ipertestuale al file. Ogni volta che l'utente fa clic sul collegamento, il browser scaricherà automaticamente il file.

<a href="downloads/test.zip">Scarica il file ZIP</a>
<a href="downloads/masters.pdf">Scarica il file PDF</a>
<a href="downloads/sample.jpg">Scarica il file immagine</a>
<a href="downloads/setup.exe">Scarica file EXE</a>

Cliccando sul link che punta a un file PDF o immagine non provoca il download diretto sul disco rigido del drive. Il file verrà aperto solo nel browser. Inoltre, puoi salvarlo sul disco rigido. Tuttavia, per impostazione predefinita, i file zip e exe vengono scaricati automaticamente sul disco rigido.

Scaricare forzatamente con PHP

Puoi usare la funzione PHP readfile() per forzare il download diretto di immagini o altri tipi di file sul disco rigido dell'utente. In questo esempio, creeremo una semplice raccolta di immagini che permette all'utente di scaricare i file immagine facendo clic con il mouse dal browser.

Creiamo un file chiamato “image-gallery.php” e inseriamo il seguente codice al suo interno.

<!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
    //Array che contiene i nomi dei file immagine di esempio
    $images = array("kites.jpg", "balloons.jpg");
    
    //Eseguire la scansione dell'array per creare la galleria di immagini
    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) . ‘">Scarica</a></p>’;
        echo ‘</div>’;
    }
    ?>
</html>

Se si osserva attentamente il codice di esempio sopra, si noterà il link di download che puntano al file “download.php”, la URL contiene anche il nome del file immagine come stringa di ricerca. Inoltre, utilizziamo la funzione PHP urlencode() per codificare il nome del file immagine, in modo che possa essere trasmesso sicuramente come parametro URL, perché il nome del file potrebbe contenere caratteri non sicuri per l'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("Invalid file name!");
    }
}
?>

同样,您可以强制下载其他文件格式,例如.doc,pdf文件等。

上面示例(第8行)中的正则表达式将完全不允许以点字符(.)开头或结尾的文件名,例如,例如,它允许使用kites.jpg或Kites.jpg,myscript.min.js等文件名,但不允许kites.jpg.或.kites.jpg。

请查看有关正则表达式的教程,以详细了解正则表达式。