entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

descargar archivos que están fuera del public_html

Hola, estoy desarrollando una aplicación en php y me tengo que mostrar imagenes y pdf que se encuentran fuera de la carpeta "public_html" del servidor. Ejemplifico los directorios.

/
/public_html/
/systems/app/files

Entonces lo que quiero hacer es obtener un vinculo a los archivos localizados /systems/app/files para poder visualizarlos.

2 Respuestas

4votos

Leonardo-Tadei Puntos227320

Hola mrgenis,

no hay forma de obtener un vínculo válido si el archivo no está en el DocumentRoot del servidor web o en un subdirectorio de él.

Sin embargo, es simple resolverlo con PHP, que sí puede ver todo el disco (salvo que el servidor tenga impuestas retricciones con OpenBaseDir):

Sería así:

<?php
// abre el archivo en modo binario
$nombre = '/systems/app/files/'.$_GET['archivo'];
$fp = fopen($nombre, 'rb');
// envía las cabeceras necesarias según el tipo de archivo, por ejemplo
header("Content-Type: image/png");
// El tamaño del archivo
header("Content-Length: " . filesize($nombre));
// le dice al navegador que es una descarga para que muestre el diálogo de guardar
header("Content-Disposition: attachment; filename=\"{$_GET['archivo']}\"");
// vuelca la imagen y detiene el script
fpassthru($fp);
exit;
?>

Si el script se llama por ejemplo descargar.php y querés descargar el archivo imagen.png, lo llamarías así: descargar.php?imagen.png

Tendrías que agregar un if o switch para que el script emita el Content-Type corercto dependiendo del tipo de archivo.

Si tenés por ejemplo los nombres de los archivos para descargar en una tabla de base de datos, al script descargar.php podrías pasarle el ID del registro, y en el propio script hacer la query para obtener el nombre.

El código es una adaptación de ejemplos del manual de PHP:
http://ar2.php.net/manual/es/function.fpassthru.php
http://ar2.php.net/manual/es/function.header.php

Saludos cordiales!

0voto

MrGenis comentado

Hola, e seguido tu consejo y me ha resultado de maravilla, como el proceso para generar el archivo es por un servicio REST y los archivos se envían en base64 he optado por guardarlos de esta forma y si se piden despues no tendré que codificar nuevamente el archivo.

data:image/jpg;base64,0ascj0asj9c0a....

0voto

Leonardo-Tadei comentado

Me alegra.

Muy buena la idea de poner los archivos como texto ya codificados en base64! Tomo nota!

Aunque la aplicación no los muestre solo por REST, se puede poner perfectamente una imagen como string en el SRC de un IMG para que el navegador las muestre.

Saludos!

1voto

mrczrt Puntos6940

Hola, puedes hacerlo desde apache en el httpd.conf : aqui puedes encontrar el ejemplo es la documentación oficial de apache : Aquí.

En el apartado Files Outside the DocumentRoot esta lo que buscas. saludos.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta