La imagen cargada solo está disponible después de actualizar la página.
Cuando subo una imagen, el archivo se guarda correctamente y la ruta se establece correctamente. Pero la imagen cargada no se muestra inmediatamente después de enviar el formulario. Solo cuando recargo la página, se muestra la imagen cargada.
Estoy guardando el archivo subido como se muestra a continuación:
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 recargar la página y cómo puedo solucionar este problema?
Está escribiendo el archivo directamente en la carpeta del proyecto del IDE y su intención parece guardar el archivo en la carpeta de implementación de la aplicación web. Esta es una mala idea y se debe a las siguientes 3 razones principales:
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 en segundo plano en el IDE que se encarga de que la carpeta de trabajo del servidor se sincronice con las últimas actualizaciones (esto en términos del IDE se llama "publicación"). Esta es la causa principal del problema que estás viendo.
En el código del mundo real, existen circunstancias en las que almacenar archivos cargados en la carpeta de implementación de la aplicación web no funcionará en absoluto. Algunos servidores (ya sea de forma predeterminada o por configuración) no expanden el archivo WAR implementado en el sistema de archivos del disco local, sino completamente en la memoria. No puede crear nuevos archivos en la memoria sin editar básicamente el archivo WAR implementado y volver a implementarlo.
Incluso cuando el servidor expande el archivo WAR implementado al sistema de archivos del disco local, todos los archivos recién creados se perderán al volver a implementar o incluso al reiniciar, simplemente porque esos archivos nuevos no forman parte del archivo WAR original.
En su lugar, debe escribirlo en una ruta fija fuera de la carpeta de proyecto/implementación. Por ejemplo, /var/webapp/uploads
. Luego, para que su aplicación web lo proporcione, simplemente agréguelo como un nuevo contexto de aplicación web al servidor.
Según tu pregunta anterior, sé que estás 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 > Configuration > HTTP Service > Virtual Servers , o a nivel de aplicación web agregando la siguiente línea al /WEB-INF/glassfish-web.xml
(su IDE debería haber generado uno automáticamente; tenga en cuenta que esto El archivo es anterior a Glassfish 3.1 sun-web.xml
, por lo que si ve manuales/blogs/tutoriales que hacen referencia a él, sí, es exactamente el mismo archivo):
<property name="alternatedocroot_1" value="from=/uploads/* dir=/var/webapp" />
De cualquier manera, debería poder usar http://localhost:8080/contextname/uploads/ * para servir esas imágenes cargadas de <img>
la forma habitual.
Ver también:
- ¿Cómo cargar archivos al servidor usando JSP/Servlet?
- Forma recomendada de guardar archivos cargados en una aplicación de servlet (contiene un ejemplo de configuración de Tomcat)
- Leyendo/escribiendo un archivo de texto en un servlet, ¿dónde debería almacenarse este archivo en JBoss? (contiene un ejemplo de configuración de JBoss)
- La forma más sencilla de servir datos estáticos desde fuera del servidor de aplicaciones en una aplicación web Java