2011-09-01 10 views
5

Tengo una aplicación web con un formulario de carga donde los usuarios pueden cargar archivos.Java EE: ¿la mejor manera de obtener una ruta real para los archivos cargados?

Me gustaría almacenar los archivos de una carpeta 'archivos'. Y me gustaría que esta carpeta se coloque directamente debajo de la raíz de la aplicación web.

Usando struts2, en mi uploadFileAction, puedo configurar fácilmente este camino con String uploadDir = ServletActionContext.getServletContext().getRealPath("/files")+ "/";

pero cuando estoy tratando de recuperar los archivos, por lo visto mi grano de la que intenta acceder al archivo no tiene acceso a getServletContext() y por lo tanto arroja un nullpointer en getRealPath

Ahora estoy tratando de averiguar cómo debo abordar esto. He oído que los recursos de primavera son el camino a seguir, pero no puedo encontrar ningún ejemplo relevante.

¿Hay alguna manera fácil de obtener mis rutas? Solo quiero el rootpath para mi aplicación web. Nada más y nada menos ...

Respuesta

8

Me gustaría que esta carpeta se coloque directamente debajo de la raíz de la webapp.

Esto no va a funcionar. Todos esos archivos se perderán cada vez que vuelva a implementar la aplicación web o incluso cuando reinicie el servidor. Esos archivos no se incluyen como parte de la GUERRA original.

Necesita almacenarlos en una ruta fija fuera del contexto de la aplicación web. P.ej. /var/webapp/uploads. Puede configurar esta ruta en un archivo de propiedades o como una propiedad del sistema.

+0

Wow. No pensé en eso. Gracias por señalar mi error obvio. Pero como me muevo entre plataformas (ventanas de Linux), necesito una ruta relativa a mi directorio de carga. No me gusta editar un archivo de propiedades cada vez que hago un salto de plataforma ... – user829237

+1

En Java 'File' API, las rutas tipo Unix como'/var/webapp/uploads' funcionan perfectamente bien en Windows también. Simplemente será relativo al disco desde donde se ejecuta el código y Java se ocupará de las barras. P.ej. cuando el servidor se ejecuta en 'C:', terminará como 'C: \ var \ webapp \ uploads'. – BalusC

+0

Gracias por despejar ese bit up. Perdóname por ser unix-newb, pero aún no estoy seguro de cómo especificar el camino, ya que mi servidor unix es un host compartido y creo que solo tengo acceso al directorio ~ y tendré que poner el archivos en algún lugar debajo de eso ... ¡Cualquier apuntador sería de gran ayuda! – user829237

3

He encontrado algunas formas de lograr esto independientemente de la plataforma de sistema operativo que esté utilizando. Normalmente me gusta almacenar mis archivos de alguna manera en relación con mi aplicación web. Dicho esto, la forma más fácil de hacerlo es usar el archivo de su clase como referencia para obtener la ruta real. Yo uso algo similar a lo siguiente para almacenar archivos de imagen para algunas aplicaciones web que he construido:

public class FileLocationTest { 

    public static void main(String[] args) { 
     String path = FileLocationTest.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 
     System.out.println(path); 
    } 
} 

Esto se puede hacer usando una clase de utilidad estática en su aplicación web, o cualquier clase, para el caso de obtenga la ruta real de su aplicación independientemente del sistema operativo. Como alternativa, en un servlet también utilicé la clase de solicitud para obtener la ubicación de Tomcat si mi aplicación está en un área diferente, algo como esto:

String location = request.getClass().getProtectionDomain().getClassLoader().getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 
    String path = location.substring(0, location.indexOf("/tomcat")) + "/data/events/images/"; 
Cuestiones relacionadas