Cómo guardar un archivo en un servidor (contenedor web) a través de una aplicación web Java EE?

StackOverflow https://stackoverflow.com/questions/2663204

Pregunta

he desarrollado una aplicación web Java EE. Esta aplicación permite al usuario cargar un archivo con la ayuda de un navegador. Una vez que el usuario ha subido su archivo, esta aplicación primeras guardarán los archivos descargados en el servidor (en el que se está ejecutando) y luego lo procesa.

En la actualidad, estoy almacenando el archivo en el servidor de la siguiente manera:

try {
    // formFile represents the uploaded file
    FormFile formFile = programForm.getTheFile();
    String path = getServlet().getServletContext().getRealPath("") + "/"
        + formFile.getFileName();
    System.out.println(path);
    file = new File(path);
    outputStream = new FileOutputStream(file);
    outputStream.write(formFile.getFileData());
}

donde, el formFile representa el archivo subido.

Ahora, el problema es que está funcionando muy bien en algunos servidores, pero en algunos servidores de la getServlet().getServletContext().getRealPath("") está volviendo null por lo que el camino final que estoy recibiendo es null/filename y el archivo no se almacena en el servidor.

Al revisar la API para ServletContext.getRealPath() método, he encontrado lo siguiente:

  

public java.lang.String getRealPath(java.lang.String path)

     

Devuelve una cadena con la ruta real por un camino virtual dado. Por ejemplo, la ruta "/index.html" devuelve la ruta absoluta del archivo en el sistema de archivos del servidor se sirve de una solicitud de "http://host/contextPath/index.html", donde contextPath es la ruta de contexto de esta ServletContext.

     

El camino real devuelta será en una forma apropiada para el sistema informático y operativo en el que el contenedor de servlets se está ejecutando, incluyendo los separadores de ruta adecuados. Este método devuelve un valor nulo si el contenedor de servlets no puede traducir la ruta de acceso virtual a un camino real por cualquier motivo (por ejemplo, cuando se pone a disposición el contenido de un archivo .war).

Así que, ¿Hay alguna otra manera por la cual puedo almacenar archivos en los servidores también que está regresando null para getServlet().getServletContext().getRealPath("")

¿Fue útil?

Solución

Escribir en el sistema de archivos de un contenedor Java EE no es muy recomendable, especialmente si usted necesita para procesar los datos escritos:

  • no es transaccional
  • perjudica la portabilidad (lo que si usted está en un entorno en clúster)
  • que requiere a los parámetros externos de configuración para la ubicación de destino

Si esto es una opción, que sería almacenar los archivos de base de datos o utilizar un repositorio JCR (como Jackrabbit ).

Otros consejos

Por especificación, el único camino "real" que está garantizado para conseguir formar un contenedor de servlets es un directorio temporal.

Se puede conseguir que a través de la ServletContext.gerAttribute("javax.servlet.context.tempdir"). Sin embargo, estos archivos no son visibles para el contexto web (es decir, no se puede publicar una URL sencilla para entregar esos archivos), y los archivos no se garantiza de ninguna manera de sobrevivir a una aplicación web o servidor de reinicio.

Si usted simplemente necesita un lugar para almacenar un archivo de trabajo por un corto tiempo, entonces este trabajo fino voluntad para usted.

Si realmente necesita un directorio, que puede hacer que sea un parámetro de configuración (ya sea una variable de entorno, una propiedad Java (es decir java -Dyour.file.here=/tmp/files ...), un conjunto de parámetros de contexto en el web.xml, un parámetro de configuración almacenada en su base de datos a través de una formulario web, etc.). Luego le toca al desplegador para establecer este directorio para usted.

Sin embargo, si necesita más tarde servir realmente para arriba ese archivo, usted necesitará un mecanismo específico de contenedores para "montar" directorios externos en que su aplicación web (Glassfish como "raíces doc alternativos", otros tienen conceptos similares), o tendrá que escribir un servlet / filtro para servir de almacén de archivos fuera de su aplicación web. Este FileServlet es bastante completa, y como se puede ver, la creación de su propia, aunque no es difícil, no es trivial para hacerlo bien.

Editar

El punto básico es el mismo, pero en lugar de utilizar "getRealPath", sólo tiene que utilizar "getInitParameter".

Así que:

String filePath = getServletContext().getInitParameter("storedFilePath") + "/" + fileName;

y estar en su camino.

Editar de nuevo:

En cuanto a los contenidos de la ruta de acceso, que le daría una ruta absoluta. De lo contrario, tendría que saber dónde está el servidor de aplicación establece su ruta predeterminada durante exeuction, y cada servidor de aplicaciones así puede usar diferentes directorios. Por ejemplo, creo que el directorio de trabajo para Glassfish es el directorio de configuración del dominio en ejecución. No es una elección muy obvia.

Por lo tanto, utilizar una ruta absoluta, lo más definitivamente. Así, usted sabe donde están los archivos irán, y se puede controlar los permisos de acceso a nivel de sistema operativo para ese directorio, si es necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top