Descargar archivos a la fuerza en PHP

Muhammad Abubakar 30 enero 2023
  1. Forzar la descarga de un archivo en PHP
  2. Descargar archivos con PHP
  3. La función readfile()
Descargar archivos a la fuerza en PHP

En este tutorial, aprendemos cómo forzar la descarga de archivos en PHP.

Forzar la descarga de un archivo en PHP

Este proceso requiere dos pasos:

  1. Cree el archivo PHP para manejar ese archivo que desea proteger.
  2. Agregue una relevancia a ese archivo PHP dentro del HTML de la página durante la cual aparece.

Después de cargar un archivo en el servidor, cree un documento PHP en un editor de texto. Por ejemplo, si desea forzar la descarga de sample.pdf en lugar de verlo en línea, cree un script como este.

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

La referencia del tipo de contenido en PHP es importante: es el tipo MIME del archivo que está protegiendo. Por ejemplo, si guardó un archivo MP3 en su lugar, necesitaría reemplazar la aplicación / pdf con un MPEG de audio.

Descargar archivos con PHP

Por lo general, no es necesario utilizar un lenguaje de secuencias de comandos del lado del servidor como PHP para descargar imágenes, archivos zip, documentos PDF, archivos exe, etc. Si este tipo de archivo se almacena en una carpeta pública accesible, simplemente puede crear una hipervínculo que apunta a ese archivo, y cada vez que un usuario hace clic en el enlace, el navegador descargará automáticamente ese archivo.

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

La función readfile()

Puede forzar la descarga de imágenes u otros tipos de archivos directamente en el disco duro del usuario mediante la función PHP readfile(). Aquí estamos creando una galería de imágenes simple que permitirá a los usuarios descargar los archivos de imagen desde el navegador con un solo clic del mouse. Creemos un archivo llamado “image-gallery.php” y pongamos el siguiente código en él.

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

Si observa detenidamente el programa de ejemplo anterior, puede encontrar el enlace de descarga que conduce a un archivo; la URL también incluye el nombre del archivo de imagen como una cadena de consulta. También utilizamos la función urlencode() de PHP para codificar los nombres de los archivos de imagen para que puedan pasarse de forma segura como parámetros de URL, ya que los nombres de archivo pueden contener caracteres de URL inseguros.

Aquí está el código completo del archivo "download.php", que fuerza la descarga de la imagen.

<?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!");
    }
}
?>

Asimismo, puede forzar la descarga de otros formatos de archivo como Word Doc, archivos PDF, etc. La expresión regular en el ejemplo anterior simplemente no permite archivos con nombres que comiencen o terminen con un punto (.). Por ejemplo, permite nombres de archivo como hello.jpeg o resampled1.jpeg, myscript.min.js, pero no permite hello.jpeg. o .resampled.Jpeg..

Artículo relacionado - PHP File