La imagen cargada solo está disponible después de actualizar la página

Cuando cargo una imagen, el archivo se guarda con éxito y la ruta se establece correctamente. Pero la imagen cargada no se muestra inmediatamente después del envío del formulario. Solo cuando recargo la página, se muestra la imagen cargada.

Estoy guardando el archivo cargado de la siguiente manera:

InputStream is; try { File file = new File("C:\\****\\*****\\Documents\\NetBeansProjects\\EventsCalendary\\web\\resources\\images\\uploadPhoto.png"); is = event.getFile().getInputstream(); OutputStream os = new FileOutputStream(file); setUserPhoto("\\EventsCalendary\\resources\\images\\"+file.getName()); byte buf[] = new byte[1024]; int len; while ((len = is.read(buf)) > 0) { os.write(buf, 0, len); } os.close(); is.close(); } catch (IOException ex) { System.out.println(ex.getStackTrace()); } 

¿Por qué la imagen cargada solo se muestra después de volver a cargar la página y cómo puedo solucionar esto?

Está escribiendo el archivo directamente en la carpeta del proyecto IDE y su bash parece guardar el archivo en la carpeta de implementación de la aplicación web. Esta es una mala idea y está bien debido a las siguientes 3 razones principales:

  1. Los cambios en la carpeta del proyecto del IDE no se reflejan inmediatamente en la carpeta de trabajo del servidor. Hay una especie de trabajo de fondo en el IDE que se ocupa de que la carpeta de trabajo del servidor se sincronice con las últimas actualizaciones (esto es en términos IDE llamados “publicación”). Esta es la causa principal del problema que estás viendo.

  2. En el código del mundo real existen circunstancias en las que el almacenamiento de los archivos cargados en la carpeta de implementación de la aplicación web no funcionará en absoluto. Algunos servidores (no de forma predeterminada o por configuración) no expanden el archivo WAR implementado en el sistema de archivos del disco local, sino que lo almacenan completamente en la memoria. No puede crear nuevos archivos en la memoria sin básicamente editar el archivo WAR desplegado y volver a implementarlo.

  3. Incluso cuando el servidor expande el archivo WAR desplegado en el sistema de archivos del disco local, todos los archivos recién creados se perderán en una reimplementación o incluso un simple reinicio, simplemente porque esos nuevos archivos no son parte del archivo WAR original.

En su lugar, debe escribirlo en una ruta fija fuera de la carpeta project / deploy. Por ejemplo, /var/webapp/uploads . Luego, para que sea atendido por su aplicación web, simplemente agréguela como un nuevo contexto de aplicación web al servidor.

En función de su pregunta anterior, sé que está usando Glassfish 3.1. En este servidor, se llama “host virtual”. Puede configurarlo a nivel de servidor en la consola de administración en http: // localhost: 4848 > Configuración> Servicio HTTP> Servidores virtuales , o en el nivel de aplicación agregando la siguiente línea a /WEB-INF/glassfish-web.xml ( su IDE debería haber generado uno automáticamente, tenga en cuenta que este archivo es anterior a Glassfish 3.1 llamado sun-web.xml , por lo que si está viendo manuales / blogs / tutoriales que hacen referencia a él, sí, es exactamente el mismo archivo):

  

De cualquier forma, debe poder usar http: // localhost: 8080 / contextname / uploads / * para publicar las imágenes cargadas desde la forma habitual.

Ver también:

  • ¿Cómo subir archivos al servidor usando JSP / Servlet?
  • Forma recomendada para guardar archivos cargados en una aplicación de servlet (contiene un ejemplo de configuración de Tomcat)
  • Lectura / escritura de un archivo de texto en un servlet, ¿dónde debería almacenarse este archivo en JBoss? (contiene el ejemplo de configuración de JBoss)
  • La forma más simple de servir datos estáticos desde fuera del servidor de aplicaciones en una aplicación web Java