Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Forzar descargas de archivos con PHP
#1
En algunas ocasiones necesitamos que un archivo sea para descargar y no para ser visualizado en el navegador. Esto se puede hacer utilizando una tecnología del lado del servidor, como puede ser PHP.
[Imagen: forzar-descargas-php.png]

Veremos dos formas de hacerlo, una básica y otra más avanzada pero también más segura.

Forzar descarga (Básico)

Primero creamos un archivo llamado, por ejemplo, “download.php“, en el que tendríamos que colocar el siguiente código:

Código PHP:
<?php
$file 
$_GET['file'];
header("Content-disposition: attachment; filename=$file");
header("Content-type: application/octet-stream");
readfile($file);
?>

Con “Content-disposition: attachment; filename=$file” indicamos que el archivo se debe mostrar como adjunto (para descargar).

Y para crear el enlace pondríamos:

Código PHP:
<a href="download.php?file=imagen.jpg">Descargar</a

Forzar descarga (Seguro)

Ahora veamos cómo hacer el script más seguro.

Por un lado, el script anterior permite descargar cualquier archivo del servidor. Por ejemplo, cualquiera podría descargar nuestro archivo ‘index.php‘ con solo cambiar la ruta de descarga por “download.php?file=../index.php“.

Además, vamos a comprobar previamente que el archivo existe, para evitar errores en caso de que el archivo no se encuentre en el servidor.

Código PHP:
<?php
 
if (!isset($_GET['file']) || empty($_GET['file'])) {
 exit();
}
$root "archivos/";
$file basename($_GET['file']);
$path $root.$file;
$type '';
 
if (
is_file($path)) {
 
$size filesize($path);
 if (
function_exists('mime_content_type')) {
 
$type mime_content_type($path);
 } else if (
function_exists('finfo_file')) {
 
$info finfo_open(FILEINFO_MIME);
 
$type finfo_file($info$path);
 
finfo_close($info);
 }
 if (
$type == '') {
 
$type "application/force-download";
 }
 
// Definir headers
 
header("Content-Type: $type");
 
header("Content-Disposition: attachment; filename=$file");
 
header("Content-Transfer-Encoding: binary");
 
header("Content-Length: " $size);
 
// Descargar archivo
 
readfile($path);
} else {
 die(
"El archivo no existe.");
}
 
?>

Mediante la función basename() hacemos que se devuelva únicamente el nombre del archivo, eliminando cualquier ruta, para que no se puedan descargar archivos de otras carpetas del servidor.

Con la variable $root hemos definido la carpeta donde se encuentran los archivos para descargar.


Posibles temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Como subir Archivos, Imagenes PHP MysQL gassip 0 611 24-10-2016, 06:59 AM
Último mensaje: gassip
  CONECTAR Y LISTAR ARCHIVOS DE GOOGLE DRIVE CON PHP khristia 1 286 16-08-2016, 08:29 PM
Último mensaje: efbsfcd
  Gestor de Archivos ElFinder gassip 6 369 03-08-2016, 12:16 AM
Último mensaje: Jouser
  No se puede cargar archivos de DBF a JIRA en Windows Aguinigaje 2 311 02-04-2016, 06:41 PM
Último mensaje: DaveNPlay
  Subir multiples archivos o imágenes al servidor y guardarlas con PHP y MySQL cmascreativo 1 329 18-02-2016, 09:55 PM
Último mensaje: index
Bombilla Ver directorios y archivos con php luis-ml 0 188 15-08-2015, 11:29 PM
Último mensaje: luis-ml
  Configurar Mostrar indice de archivos en una carpeta por .htaccess Kevin9908 0 222 01-07-2015, 02:23 AM
Último mensaje: Kevin9908
  [PHP] Subida de archivos torgar22 0 230 28-02-2015, 02:51 PM
Último mensaje: torgar22
  [Tutorial] Aumentar el Tamaño Máximo al Cargar Archivos con PHP y Apache papanoel 0 668 22-01-2014, 04:38 AM
Último mensaje: papanoel
Gran sonrisa HTML para subir los archivos a 12 mirrors rapidamente DannecraftWTF 13 1,035 29-07-2013, 08:29 AM
Último mensaje: mispracticas2009



Usuarios navegando en este tema: 1 invitado(s)