Servir imágenes contenidas en un fichero con Apache

Con PHP y cualquier lenguaje que corra en el lado del servidor se pueden generar páginas al vuelo a partir de datos contenidos en una base de datos. Ahí tenemos Wordpress por ejemplo, que almacena los posts en una BD MySQL.

Me gustaría saber si con Apache se pueden servir imágenes contenidas en un fichero o archivo que haga de contenedor, como pueda ser un tar, ya que no quiero compresión. Total, sólo serviría para ralentizar el proceso, ya que normalmente las imágenes ya van comprimidas sea con pérdida (jpg) o sin ella (png).

Con servir imágenes me refiero a que en el navegador se pueda cargar una imagen cuya url está incrustada en una etiqueta html <img> de una página. Es decir, no existe físicamente en el directorio htdocs, pero se puede acceder a ella desde su url "falsa". Algo así como lo que se puede hacer con el módulo url rewriting de Apache, que traduce una url "falsa" a una url válida con query string para que sea interpretada por PHP.
podrias usar un script php que sirva la imagen desde el .tar

http://www.php.net/manual/es/phar.decompress.php te sera de interes.

Aunque el fichero .tar no necesita estar dentro de htdocs, el user que corra el proceso apache tiene que tener permisos de lectura sobre el fichero y su ruta de acceso. Normalmente con que sean del grupo www-data suele ser suficiente.

Por mera curiosidad, hay alguna necesidad imperativa para que las imagenes esten dentro de un tar? Lo digo porque seria mucho mas sencillo y optimo si las imagenes estuvieran uno a uno sin tar (aunque fuera de htdocs) o incluso en una bd.
No veo motivo para esto al menos que quiera evitar algo como el hotlinking posiblemente la verdad y aun así no seria el método mas adecuado creo yo.
Bueno, es cierto que tampoco expliqué para que quería hacer eso y con que fin.
Lo primero de todo decir que no es para evitar el hotlinking, de hecho hace unos meses hice unas pruebas con eso y me funcionó bien, basándose en el htttp referer. Pero en este caso no quiero evitar el hotlinking, la idea es que se pueda acceder a la imagen por url también.

Cuando dije formato .tar no lo dije con la intención de que sea exactamente ese, si no cualquier formato de archivo que pueda empaquetar ficheros en su interior sin comprimirlos (zip, rar y compañía creo que al archivar dan la posibilidad de no meter compresión).

Estoy haciendo un sistema para archivar artículos y textos que me encuentro por internet, y apuntes míos propios de programación, Linux y otras hierbas. He decidido que el mejor formato para esto es html, un estandar abierto compatible con cualquier navegador de internet, y que tiene la ventaja de adaptarse a la pantalla en que se visualice (a no ser que se haga con un ancho fijo en píxeles y márgenes a los lados, como en las webs antiguas).
La idea es que aparte de poder acceder desde internet lo pueda llevar por ejemplo en un pendrive (esto último es más complicado, porque sin servidor Apache con intérprete de PHP me tocaría generar todos los artículos como páginas estáticas).
El texto de los artículos y otros datos los almacenaré en una base de datos, para tenerlo todo más ordenado. Me parece muy sucio crearme una página html para cada uno. Entonces con las imágenes me gustaría hacer lo mismo, eso de tener tropecientos ficheros es un caos y a la hora de subirlo a un ftp o copiarlo a cualquier otro dispositivo tarda una eternidad si son muchos ficheros pequeños en comparación con uno grande.

Lo del formato tar lo dije un poco por ignorancia al no entender mucho del tema, pero leo a Zokormazo que sugiere insertarlas en una BD, ¿se puede hacer eso? No lo sabía. Es decir, si yo paso una imagen a base64 por ejemplo y la inserto en un campo de una tabla no creo que haya mayor problema, el tema es que a ver como hago luego para que Apache sirva la imagen leyéndola de la BD (y sin incrustarla en el html, como si fuera un fichero físico).
Dos opciones sencillas:

- Meter la foto directamente en la bd, hay distintos metodos para ello.
- Una pool para las imagenes, en un directorio, y en la bd la ruta a la imagen, este es aun mas sencillo de gestionar. Metes todas las fotos en un directorio, /var/www/images por ejemplo, y en la bd del articulo, guardas el nombre de la imagen a linkar. Luego generas el <img usando el directorio y el nombre al que accedes con el mismo select del articulo. La bd pesa menos y se puede acceder a las imagenes directamente sin pasar por la bd, pero a la vez asocias la imagen con el articulo mediante la bd).

Incluso podrias crear una tabla en la bd para las imagenes, <id, name, src, foottext, blablabla> y meter metadatos acerca de la foto en ella (texto de pie, autor, yokese, lo que te interese), y linkar estos con la bd de articulos mediante otra tabla.
Mucho tiempo después refloto el tema para decir que hace unos días retomé esto y he dado con la forma de hacer lo que yo quería, que es cargar las imágenes almacenadas en un fichero, como puede ser un tar.

Es tan simple como:
header("Content-type: image/jpeg"); //Cambiamos la cabecera

//Con file_get_contents cargamos la imagen en el fichero tar con el wrapper phar
$contents = file_get_contents('phar://images.tar/image01.jpg');

//Y enviamos el contenido de la imagen cargada anteriormente
echo $contents;


Ahora ya todo es adaptarlo para pasar el nombre de la imagen a cargar por querystring, y con una expresión regular para modrewrite dejar una url "bonita" para las imágenes de forma que parezca que la url hace referencia a una imagen contenida en una carpeta.
5 respuestas