2011-02-09 28 views
7

Escribí una pequeña aplicación web usando Grails. El archivo de guerra resultante se implementa en un servidor de aplicaciones Tomcat.Grails y Tomcat: ¿Dónde almacenar los archivos cargados en el sistema de archivos?

La aplicación tiene una funcionalidad de carga para archivos adjuntos. Elegí guardar los archivos cargados en el disco (en lugar de almacenar blobs en el DB).

Al principio elegí un filepath dentro del webapp-dir para almacenar los archivos, pero luego me di cuenta de que este directorio se sobrescribirá con cada despliegue de un nuevo archivo war.

¿Existe un las mejores prácticas para"dónde almacenar los archivos cargados en su sistema de archivos local"?

Gracias por su ayuda.

+0

Si lees la lista de correo de Grails, notarás que tuve * la misma pregunta exacta *. Esperando una buena respuesta. –

+1

¿Podría publicar una solución aquí, si obtiene algo útil de la lista de correo? – DiegoFrings

Respuesta

1

Recomendaría usar una variable de entorno para almacenar la ubicación, o mejor aún usar una variable de entorno para establecer la ubicación de su archivo de propiedades de configuración y establecer una propiedad allí. De esta forma, el equipo de operaciones puede configurar la ubicación, que debería estar administrando las preocupaciones del sistema de archivos/configuración.

+0

Suena interesante, pero el equipo de operaciones puede configurar el directorio solo para las rutas que el servidor de aplicaciones puede manejar. si los archivos se almacenarán en digamos "/ tmp /", el servidor de la aplicación no podrá enviar esta imagen al navegador. Entonces, ¿dónde está la buena ubicación que cumple con ambos requisitos: el servidor de aplicaciones puede enviar archivos al navegador Y el directorio no se sobrescribirá en la implementación? – DiegoFrings

+0

También deben controlar la configuración del servidor de aplicaciones/servidor web. Si también necesita restituir el contenido, tenga otro parámetro de configuración como la ubicación de la url en el directorio que se está sirviendo. – codelark

2

AlphaOne, hacemos algo similar a lo que está pidiendo, pero usamos un servidor web Apache en frente de Tomcat. Recogemos la ruta completa desde el archivo de configuración y escribimos en él. Diga "/ tmp/branding". Luego, también seleccionamos la ruta url para esta ubicación desde el archivo de configuración (digamos "myapp/branding") y usamos esto dentro de nuestros GSP. Luego, en Apache, mapeamos las solicitudes de aplicaciones para esa url ("myapp/branding") para ir directamente a la ubicación del archivo, sin pasar por Tomcat.

+1

Palabra de advertencia, muchos sistemas operativos purgarán ocasionalmente el directorio tmp. A menudo se realiza en el momento del arranque si ha pasado un cierto número de días. Puede parecer impredecible y puede ser difícil de depurar. –

2

Cree un proyecto separado para cargar y pase el nombre de usuario para crear una carpeta específica para el usuario. Proporcione un enlace a este proyecto desde el proyecto principal cuando el usuario quiera cargar los archivos.

0

Supongo que está buscando una solución de mejores prácticas. Bueno, en realidad no hay ninguno, pero hay algunos lugares donde debes evitar ponerlos. Asumiré un entorno UNIX.

Por ejemplo:

  • El $ CATALINA_HOME. Simplemente deje la carpeta de la aplicación por lo que es, no la contamine con los archivos cargados.
  • /tmp. Nunca se sabe quién va a limpiar esto.

Aunque no estoy seguro de que sea una especificación bloqueada, puede consultar: linux directory structure.

La forma en que lo leí que tienen 3 opciones:

  1. Si Tomcat se ejecuta utilizando un usuario dedicado -> El directorio personal del usuario. Por ejemplo ~/Fileuploads/appname
  2. Dado que la var puede verse como un directorio creciente de datos de aplicaciones. Por ejemplo:/var/Fileuploads/appname
  3. Déjelo en manos del administrador del sistema. Mira esto: Externalizing Grails Configuration

¡Buena suerte!

Cuestiones relacionadas