Cómo guardo y recupero una imagen en mi servidor en una aplicación web java

Aquí con otra pregunta sobre Imágenes (que parece ser más difícil de lo que inicialmente predije) estoy trabajando en una aplicación web Java con JSF 2.0 (apache myFaces) y quiero que esta aplicación pueda cargar una imagen en un destino en el servidor en el que se ejecutará. Tengo un servidor de Windows r2 2008 ejecutando un mySQL Db, pero no quiero almacenar la imagen en el archivo db, prefiero almacenarlo en algún lugar del servidor y luego guardar la ruta como una cadena en el archivo db.

Me dijeron que esta es la mejor manera, pero parece que no puedo encontrar un ejemplo sobre cómo guardarlo en el servidor. Ejecuto la aplicación en el servidor Apache tomcat como un archivo WAR. así que no sé si tengo que guardar el archivo en una ruta en la unidad del servidor (es decir, C: \ images) o una carpeta especial en el proyecto (dentro de los archivos java, html) cualquier ayuda es muy apreciada . Estoy totalmente perdido y he estado atrapado todo el día tratando de resolver esto.

El código que uso para subir la imagen a la clase java es esto (cortesía de CodyS):

InputStream is = uploadedFile.getInputStream(); byte[] buffer = new byte[(int) uploadedFile.getSize()]; is.read(buffer); File f = new File("C:\\temp\\" + this.patient.getPk() + ".jpeg"); f.createNewFile(); FileOutputStream fos = new FileOutputStream(f); fos.write(buffer); //This is where I write it to the C Drive fos.close(); is.close(); 

en lugar de escribirlo en mi disco C, lo voy a ejecutar en el servidor, pero ¿dónde debería guardar la imagen para luego recuperarla y mostrarla en un archivo xhtml? Espero que tenga claro lo que necesito, avíseme si no lo estoy y trataré de explicarlo de otra manera.

en lugar de escribirlo en mi disco C, lo voy a ejecutar en el servidor, pero ¿dónde debería guardar la imagen para luego recuperarla y mostrarla en un archivo xhtml?

Eso depende de cuánto control tenga sobre la configuración del servidor. Lo ideal sería configurar una ruta fija fuera de la carpeta de webapps de Tomcat. Por ejemplo, /var/webapp/upload . Puede establecer esta ruta como un argumento de VM o una variable de entorno para que su aplicación web pueda recuperarla programáticamente sin necesidad de cambiar el código.

Por ejemplo, al especificar como argumento VM -Dupload.location=/var/webapp/upload , puede completar la carga de la siguiente manera:

 Path folder = Paths.get(System.getProperty("upload.location")); String filename = FilenameUtils.getBaseName(uploadedFile.getName()); String extension = FilenameUtils.getExtension(uploadedFile.getName()); Path file = Files.createTempFile(folder, filename + "-", "." + extension); try (InputStream input = uploadedFile.getInputStream()) { Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING); } String uploadedFileName = file.getFileName().toString(); // Now store it in DB. 

En cuanto a la devolución del archivo, lo más ideal sería agregar la ubicación de carga como un separado a Tomcat. P.ej

  

De esta forma, puede acceder directamente a http://example.com/uploads/foo-123456.ext.

Si tiene cero control sobre la configuración del servidor, entonces, bien, almacenar en el DB o enviar a un host de terceros como Amazon S3 es su mejor opción.

Ver también:

  • ¿Cómo proporcionar una ruta relativa en la clase File para cargar cualquier archivo?
  • Servicio de datos confiable

Consideraría permitir que el usuario cargue directamente en Amazon S3. Amazon ofrece un servicio para eso . Al usar ese servicio, el cliente publicará un formulario con el archivo directamente en S3. Una vez que el archivo haya llegado allí, Amazon redirigirá al cliente a uno de sus puntos finales, para confirmar que los datos han llegado, pasándole los detalles relevantes.

Los beneficios son:

  1. Su servidor no pasa mucho tiempo recibiendo archivos enormes. Puede gastar sus ciclos de CPU en algo un poco más interesante.
  2. La disponibilidad garantizada al almacenarla en S3 es probablemente mejor que la que obtendría al almacenarla en su propio cuadro de Windows.
  3. Se escala. En algún punto, su sistema de archivos se quedará sin espacio. (O llega al límite de lo que puede almacenar dentro de una carpeta).

Sugeriría que guardes tus imágenes en una subcarpeta que se encuentra en la carpeta WEB-INF de tu aplicación. Recuerde que cuando utiliza Tomcat, sus archivos WAR se extraerán automáticamente. Este enfoque también tiene la ventaja de que siempre puedes migrar tu aplicación a otro servidor, solo tienes que guardar la ruta relativa a la carpeta WEB-INF en tu base de datos.