En una reciente aplicación me veo en la necesidad de utilizar esta técnica en PHP para forzar a los usuarios a descargar archivos, estuve navegando en Internet y encontré varias maneras de hacerlo, todas parecidas.
Los beneficios que te da el pasar por un script PHP para descargar un archivo son muchos, y definitivamente mejores que el de poner el link directo al archivo para descargar, estos son algunos beneficios que podemos aplicar si utilizamos un archivo de puente para la descarga:
- Validar si el usuario esta logueado.
- Incrementar un contador de descargas para cada archivo.
- Guardar el numero IP desde donde se realiza la descarga.
- Colocar la carpeta de descarga un nivel antes del “/root” para que no puedan ingresar directamente a los archivos.
Esto lo deben colocar en un archivo, por ejemplo “download.php”
<?php
if (!isset($_GET['file']) || empty($_GET['file'])) {
exit();
}
$file = $_GET['file'];
$file = basename($file);
$file = "img/".$file;
if(is_file($file))
{
// requerido para IE
if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); }
if (function_exists('mime_content_type')){
$type = mime_content_type($file);
}else if (function_exists('finfo_file')){
$info = finfo_open(FILEINFO_MIME);
$type = finfo_file($info, $file);
finfo_close($info);
}else{
switch(strtolower(end(explode('.',$file))))
{
case 'pdf': $type = 'application/pdf'; break;
case 'zip': $type = 'application/zip'; break;
case 'jpeg':
case 'jpg': $type = 'image/jpg'; break;
default: $type = 'application/force-download';
}
}
header('Pragma: public'); // required
header('Expires: 0'); // no cache
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($file)).' GMT');
header('Cache-Control: private',false);
header('Content-Type: '.$type);
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($file));
header('Connection: close');
readfile($file);
exit();
}
?>
Para llamarlo basta con poner en alguna pagina un link para descargar y adjuntar como parametro a la imagen.
http://www.pruebas.com/download.php?file=imagen1.jpg

Comentarios