2012-08-23 21 views
10

Tengo una URL donde guardo algunos proyectos de mi trabajo, en su mayoría son archivos MDB, pero también hay algunos archivos JPG y PDF.Descargar archivos del servidor php

Lo que necesito hacer es listar cada archivo de ese directorio (ya hecho) y darle al usuario la opción de descargarlo.

¿Cómo se logra eso usando PHP?

+1

¿No es esto manejado por el navegador? – SomeKittens

+1

, pero ¿cómo obtengo el navegador para comenzar la descarga? –

+0

Proporcione un enlace al archivo? – Nick

Respuesta

24

Para leer el contenido del directorio puede utilizar readdir() y utilizar una secuencia de comandos, en mi ejemplo download.php, para descargar archivos

if ($handle = opendir('/path/to/your/dir/')) { 
    while (false !== ($entry = readdir($handle))) { 
     if ($entry != "." && $entry != "..") { 
      echo "<a href='download.php?file=".$entry."'>".$entry."</a>\n"; 
     } 
    } 
    closedir($handle); 
} 

En download.php puede forzar navegador para enviar los datos de descarga, y el uso de basename() para asegurarse de que el cliente no pasa a otro nombre de archivo como ../config.php

$file = basename($_GET['file']); 
$file = '/path/to/your/dir/'.$file; 

if(!$file){ // file does not exist 
    die('file not found'); 
} else { 
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-Disposition: attachment; filename=$file"); 
    header("Content-Type: application/zip"); 
    header("Content-Transfer-Encoding: binary"); 

    // read the file from disk 
    readfile($file); 
} 
+0

Recibo un mensaje 403; revisó el permiso de la carpeta y está configurado en 777, por lo que no tengo idea de lo que está sucediendo. –

+0

asegúrese de que la ruta sea correcta ... ruta a la carpeta y archivo –

+0

Compruebe el contenido de su archivo .htaccess en el directorio donde se encuentra su archivo. –

2

Si se puede acceder a la carpeta desde el navegador (no fuera de la raíz del documento de su servidor web), solo necesita generar enlaces a las ubicaciones de esos archivos. Si están fuera de la raíz del documento, deberá tener enlaces, botones, lo que sea, que apunten a un script PHP que maneje la obtención de los archivos desde su ubicación y la transmisión a la respuesta.

+0

Si el archivo es imagen o texto, no lo descargará. –

+0

Si se trata de un archivo que se abre en el navegador, puede usar la funcionalidad de guardar del navegador para guardarlo en el sistema de archivos. La misión aún se logra. –

+0

Si puede decirle eso al cliente, me enteré de que la mayoría de los "consumidores" no saben qué hacer si ven un archivo de texto abierto en el navegador o en un archivo pdf .. –

0

Aquí es una solución más simple para listar todos los archivos en un directorio y para descargarlo.

En su archivo index.php

<?php 
$dir = "./"; 

$allFiles = scandir($dir); 
$files = array_diff($allFiles, array('.', '..')); // To remove . and .. 

foreach($files as $file){ 
    echo "<a href='download.php?file=".$file."'>".$file."</a><br>"; 
} 

La lista de funciones scandir() todos los archivos y directorios ubicados en la ruta especificada. Funciona tanto con PHP 5 y 7. PHP

Ahora en el download.php

<?php 
$filename = basename($_GET['file']); 
// Specify file path. 
$path = ''; // '/uplods/' 
$download_file = $path.$filename; 

if(!empty($filename)){ 
    // Check file is exists on given path. 
    if(file_exists($download_file)) 
    { 
     header('Content-Disposition: attachment; filename=' . $filename); 
     readfile($download_file); 
     exit; 
    } 
    else 
    { 
     echo 'File does not exists on given path'; 
    } 
} 
Cuestiones relacionadas