Software Guru Conference & Expo 2014

Guardar y almacenar imágenes en el filesystem

Hola, buen día a todos!

Hace ya algún tiempo realice una aplicación web en java que permitía cargar y guardar archivos en un directorio dentro de la aplicación, el problema al que me enfrente es que como tal directorio estaba dentro de la aplicación, en cada nuevo despliegue que hiciera el directorio se volvía a crear pero sin datos lógicamente.

Me di a la tarea de intentar almacenar toda mi info en una carpeta superior a la de la aplicación, pero nunca pude hacerlo, por varios detalles que para ser honestos ya ni bien recuerdo. Hoy nuevamente me doy a la tarea de hacer un desarrollo similar y es que después de almacenar la INFO en BD me convencí que lo mejor es intentar almacenar los archivos en el filesystem y su ruta en la BD, es por eso que recurro a ustedes, por que tengo unas dudas quizá un poco básicas:

Para empezar, solo por si acaso, mi stock de tecnología es:

Spring MVC 3.0
Hibernate
MySQL
MooTools y DRW (Javascript)

entonces:

1) Si estoy usando en mi ambiente local Tomcat (con ayuda de XAMPP para windows para ser precisos) , ¿Simplemente con darle la ruta del directorio de "htdocs->miCarpetaX" puedo cargar ahí los archivos? Esto para evitar que no se borre dicha carpeta en cada despliegue, tomando en cuenta que la lógica de cargar el archivo y tenerlo en mi objeto "File" ya esta.

2) Si ya quiero montar mi aplicación en un servidor de internet para el publico en general ¿Sigo la misma lógica? Es que tomando en cuenta que son SO diferentes, permisos, etc... es lo que me confunde ¿Como acceso al filesystem?

Gracias por su tiempo y ojalá puedan ayudarme en estas cosas de novatos.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

fuera del WAR

Necesitas poner tus imágenes en un directorio fuera del WAR. Si usas tomcat como tu web server, que sea un directorio que no está dentro de ningún war, para que no te lo borre (tomcat tiene un dir para contenido estático, no recuerdo si en el mismo webapps o algo tipo htdocs).

Cuando pases a producción, pues depende de la arquitectura que tengan. Si usan por ejemplo un web server como Apache httpd para el contenido estático y tiene un puente hacia tomcat con mod_proxy o mod_jk, entonces lo mejor es que guardes las imágenes en un directorio dentro del htdocs del web server, ya no de tomcat. Solamente es cuestión de permisos de usuarios y demás para que tu app pueda guardar imágenes en ese dir. Si están en distintos equipos, pueden compartir el directorio con NFS; uno de los equipos le comparte el directorio al otro equipo. Seguramente lo que más conviene es que el web server tenga el directorio local y el equipo con tomcat lo vea por NFS, porque serán muchas más lecturas que escrituras.

Imagen de neko069

@ezamudio. Con tu respuesta

@ezamudio.
Con tu respuesta me brincó una duda.
Qué complicaciones podría tener si uso un directorio fuera del web server? es decir, en el filesystem de la máquina que contiene el servidor, igual serían configuraciones de permisos? o existen otro tipo de dificultades?

@ezamudio

Hola ezamudio, buscando en internet encontre que la siguiente configuración me permite darle acceso a un determinado directorio a la aplicación que yo le indique, ¿a eso te referías para mi ambiente local?

___________________________________

Para darle acceso al directorio "C:\temp\img" a la aplicación "miApp" configuro "catalina.policy" asi

grant codeBase "file:${catalina.home}/webapps/miApp/-" {
java.io.FilePermission "C:\temp\img\<< ALL FILES >>", "read,write,execute,delete";
};

___________________________________

Por que no encontré mucha información sobre el directorio para contenido estático,
Gracias de antemano!

Imagen de ezamudio

permisos

neko069, lo único que necesitas para que tu webapp escriba en cualquier directorio, es que ese directorio tenga permisos de escritura y ejecución para el usuario con el que corren el contenedor.

hazek, la verdad no le sé tanto a Tomcat como para saber si es lo que necesitas. No sabía que se podían dar permisos en eso de catalina.policy pero pues a fin de cuentas el sistema operativo será quien tiene la última palabra.

Imagen de rugi

hazek De las cosas que pueden

hazek
De las cosas que pueden salir si estas cambiando de sistema operativo es el tema del File.separatorChar

Deberas validar tambien temas de espacio en disco y posible duplicación de archivos.

Una duda, como llegaste a la conclusión de que es mejor en filesystem y no en BBDD...

Saludos!!
RuGI

@rugi

Hola rugí, disculpa la demora de mi respuesta.

Mas que afirmar que es mejor ocupar el filesystem que directamente la BD en mi caso en concreto me decidí por el primero por que manejo múltiples archivos para un determinado usuario, necesito modificarlos, recuperarlos en un tiempo aceptable, y organizarlos en estructuras lógicas que por desgracia una BD de una manera sencilla no me permite realizar. Lo que si es que me he dado a la tarea de implementar una lógica que me permita hacer respaldos de toda esa información en una BD, y exista la misma para volver a crear todo el contenido (en caso de perdida) de nueva cuenta en el filesystem pues como mencione necesito un dinamismo mayor de lo que al menos mis conocimientos me permiten hacer con una BD.

Saludos!