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

PHP 基础教程

PHP 高级教程

PHP & MySQL

PHP 参考手册

Download de Arquivos PHP

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

用PHP下载文件

通常,您不一定需要使用任何服务器端脚本语言(例如PHP)来下载图像,zip文件,pdf文档,exe文件等。如果此类文件存储在公共可访问的文件夹中,则只需创建一个指向该文件的超链接,每当用户单击链接时,浏览器都会自动下载该文件。

setup.exe">Baixar arquivo EXE</test.zip">download Zip file</a>
setup.exe">Baixar arquivo EXE</masters.pdf">download PDF file</a>
setup.exe">Baixar arquivo EXE</<a href="downloads/a>
setup.exe">Baixar arquivo EXE</<a href="downloads/a>

Clicar em um link apontando para um arquivo PDF ou imagem não causará o download direto para o drive de disco rígido. Ele será aberto apenas no navegador. Além disso, você pode salvá-lo no disco rígido. No entanto, por padrão, arquivos zip e exe serão baixados automaticamente para o disco rígido.

Baixar forçado usando PHP

Você pode usar a função PHP readfile() para forçar o download direto de imagens ou outros tipos de arquivos para o disco rígido do usuário. Aqui, criaremos uma simples biblioteca de imagens que permitirá que o usuário clique e baixe os arquivos de imagens do navegador.

Vamos criar um nome chamado “image-gallery.php” do arquivo, e insira o seguinte código nele.

<!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
    //um array que contém nomes de arquivos de imagens de exemplo
    $images = array("kites.jpg", "balloons.jpg");
    
    //percorrer o array para criar uma galeria de imagens
    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>

Se você examinar cuidadosamente o exemplo de código acima, notará que há um link de download apontando para o arquivo “download.php”, a URL também contém o nome do arquivo de imagem como uma string de consulta. Além disso, usamos a função PHP urlencode() para codificar o nome do arquivo de imagem, para que possa ser transmitido como parâmetro de URL de forma segura, pois o nome do arquivo pode conter caracteres inseguros para a URL.

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

<?php
if(isset($_REQUEST["file"])){
    //获取参数
    $file = urldecode($_REQUEST["file"]); //解码URL编码的字符串
    /* 测试文件名是否包含非法字符
    例如使用正则表达式的“ ../” */
    if(preg_match('/^.[^-a--9_]$+-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。

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