Baixar arquivo forçosamente em PHP

Muhammad Abubakar 30 janeiro 2023
  1. Forçar um download de arquivo em PHP
  2. Baixar arquivos com PHP
  3. a função readfile()
Baixar arquivo forçosamente em PHP

Neste tutorial, aprendemos como forçar o download de arquivos em PHP.

Forçar um download de arquivo em PHP

Este processo requer duas etapas:

  1. Crie o arquivo PHP para lidar com o arquivo que deseja proteger.
  2. Adicione uma relevância a esse arquivo PHP dentro do HTML da página durante a qual ele aparece.

Depois de fazer upload de um arquivo para o servidor, crie um documento PHP em um editor de texto. Por exemplo, se você deseja forçar o download de sample.pdf em vez de visualizá-lo online, crie um script como este.

<?php
header("Content-disposition: attachment; filename=sample.pdf");
header("Content-type: application/pdf");
readfile("sample.pdf");
?>

A referência de tipo de conteúdo em PHP é importante: é o tipo MIME do arquivo que você está protegendo. Por exemplo, se você salvou um arquivo MP3 em vez disso, precisará substituir o aplicativo / pdf por um MPEG de áudio.

Baixar arquivos com PHP

Normalmente, você não precisa usar uma linguagem de script do lado do servidor como PHP para baixar imagens, arquivos zip, documentos PDF, arquivos exe, etc. Se este tipo de arquivo estiver armazenado em uma pasta pública acessível, você pode simplesmente criar um um hiperlink apontando para esse arquivo e, cada vez que um usuário clica no link, o navegador faz o download automaticamente desse arquivo.

<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>

a função readfile()

Você pode forçar o download de imagens ou outros tipos de arquivo diretamente para o disco rígido do usuário usando a função PHP readfile(). Aqui estamos criando uma galeria de imagens simples que permitirá aos usuários baixar os arquivos de imagem do navegador com um único clique do mouse. Vamos criar um arquivo chamado “image-gallery.php” e colocar o seguinte código nele.

 	<!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("hello.jpg", "resampled1.jpg");
    
    // Loop through array to create image gallery
    foreach($images as $image){
        echo '<div class="img-box">';
            echo '<img src="/examples/images/' . $image . '" width="200" alt="' .  pathinfo($image, PATHINFO_FILENAME) .'">';
            echo '<p><a href="/examples/php/download.php?file=' . urlencode($image) . '">Download</a></p>';
        echo '</div>';
    }
    ?>
</body>
</html>

Se você olhar atentamente para o programa de exemplo acima, poderá encontrar o link de download que leva a um arquivo; o URL também inclui o nome do arquivo de imagem como uma string de consulta. Também usamos a função urlencode() do PHP para codificar os nomes dos arquivos de imagem para que possam ser passados ​​com segurança como parâmetros de URL, já que os nomes de arquivo podem conter caracteres de URL não seguros.

Aqui está o código completo do arquivo "download.php", que força o download da imagem.

<?php
if(!empty($_GET['file'])){
    $fileName = basename($_GET['file']);
    $filePath = 'files.txt/'.$fileName;
    if(!empty($fileName) && file_exists($filePath)){
        // Define headers
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-Disposition: attachment; filename=$fileName");
        header("Content-Type: application/zip");
        header("Content-Transfer-Encoding: binary");
        
        // Read the file
        readfile($filePath);
        exit;
    }else{
        echo 'The file does not exist.';
    }
}
    } else {
        die("Invalid file name!");
    }
}
?>

Da mesma forma, você pode forçar o download de outros formatos de arquivo como Word Doc, arquivos PDF, etc. A expressão regular no exemplo acima simplesmente não permite arquivos com nomes que começam ou terminam com um ponto (.). Por exemplo, permite nomes de arquivos como hello.jpeg ou resampled1.jpeg, myscript.min.js, mas não permite hello.jpeg ou .resampled.Jpeg..

Artigo relacionado - PHP File