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

Tutorial básico PHP

Tutorial avanzado PHP

PHP & MySQL

Manual de Referencia PHP

Descarga de archivos en PHP

En este tutorial, aprenderás cómo forzar la descarga de archivos utilizando PHP.

Descarga de archivos con PHP

Normalmente, no es necesario utilizar ningún lenguaje de script del lado del servidor (por ejemplo, PHP) para descargar imágenes, archivos zip, documentos pdf, archivos exe, etc. Si dichos archivos se almacenan en una carpeta accesible al público, simplemente crea un enlace al archivo y cada vez que el usuario haga clic en el enlace, el navegador descargará automáticamente el archivo.

<a href="downloads/Descarga el archivo Zip>/a>
<a href="downloads/Descarga el archivo PDF>/a>
<a href="downloads/sample.jpg">Descargar archivo de imagen</a>
<a href="downloads/setup.exe">Descargar archivo EXE</a>

Hacer clic en un enlace que apunta a un archivo PDF o de imagen no causará que se descargue directamente al disco duro. Se abrirá únicamente en el navegador. Además, se puede guardar en el disco duro. Sin embargo, por defecto, los archivos zip y exe se descargarán automáticamente al disco duro.

Descarga forzada de PHP

Puede usar la función PHP readfile() para forzar la descarga directa de imágenes u otros tipos de archivos al disco duro del usuario. Aquí, crearemos una sencilla biblioteca de imágenes que permita al usuario hacer clic en el navegador para descargar archivos de imágenes.

Vamos a crear un nombre de variable “image-gallery.php” del archivo, y coloque el siguiente código dentro de él.

<!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 que contiene nombres de archivos de imágenes de ejemplo
    $images = array("kites.jpg", "balloons.jpg");
    
    //Recorrer el array para crear una galería de imágenes
    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) . '">Descargar</a></p>';
        echo '</div>';
    }
    ?>
</html>

Si observa detenidamente el código de ejemplo superior, se encontrará con un enlace de descarga que apunta al archivo “download.php”, la URL también contiene el nombre del archivo de imagen como cadena de consulta. Además, utilizamos la función PHP urlencode() para codificar el nombre del archivo de imagen, para que pueda transmitirse de manera segura como parámetro de URL, ya que el nombre del archivo puede contener caracteres inseguros para la URL.

Este es el código completo del archivo "download.php", que permite forzar la descarga de imágenes.

<?php
if(isset($_REQUEST["file"])){
    //Obtener parámetros
    $file = urldecode($_REQUEST["file"]); //Decodificar la cadena de URL codificada
    /* Verificar si el nombre del archivo contiene caracteres ilegales
    Por ejemplo, el uso de expresiones regulares como "../” */
    if(preg_match('/^[^.][-a--9_]+-z]$/i', $file)){
        $filepath = "images/'' . $file;
        // Descarga en proceso
        if(file_exists($filepath)) {
            header('Content-Descripción: Transferencia de archivos
            header('Content-Tipo: aplicación/octet-stream
            header('Content-Disposición: adjunto; nombre_de_archivo="'.basename($filepath).'"');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: público');
            header('Content-Longitud: ' . filesize($filepath));
            flush(); //Limpie la salida del búfer del sistema
            readfile($filepath);
            die();
        } else {
            http_response_code(404);
	        die();
        }
    } else {
        die("Nombre de archivo inválido!");
    }
}
?>

Del mismo modo, puede forzar la descarga de otros formatos de archivo, como .doc, archivos .pdf, etc.

Por ejemplo, en el ejemplo anterior (número8línea)Las expresiones regulares no permitirán nombres de archivo que comiencen o terminen con un punto (.). Por ejemplo, permite usar nombres de archivo como kites.jpg o Kites.jpg, myscript.min.js, pero no permite kites.jpg. o .kites.jpg.

Consulte la información sobreExpresiones regularesla guía para entender a fondo las expresiones regulares.