上传的图像仅在刷新页面后才可用

上传图片时,文件成功保存,path设置成功。 但是在提交表单之后,上传的图像不会立即显示。 只有当我重新加载页面时,才会显示上传的图像。

我正在保存上传的文件如下:

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()); } 

为什么上传的图片只在重新加载页面后才显示,我该如何解决?

您直接将文件写入IDE的项目文件夹,您的意图似乎将文件保存在webapp的deploy文件夹中。 这是一个坏主意,由于以下三个主要原因:

  1. IDE的项目文件夹中的更改不会立即反映在服务器的工作文件夹中。 在IDE中有一种后台作业,它注意到服务器的工作文件夹与上次更新(在IDE中称为“发布”)是同步的。 这是你所看到的问题的主要原因。

  2. 在真实世界的代码中,存在将上传的文件存储在webapp的deploy文件夹中根本不起作用的情况。 一些服务器(默认或通过configuration)不会将已部署的WAR文件扩展到本地磁盘文件系统,而是完全在内存中。 如果没有基本编辑已部署的WAR文件并重新部署,则无法在内存中创build新文件。

  3. 即使服务器将已部署的WAR文件扩展到本地磁盘文件系统,所有新创build的文件在重新部署或甚至简单重新启动时都将丢失,只是因为这些新文件不是原始WAR文件的一部分。

您需要将其写入到project / deploy文件夹之外的固定path。 例如, /var/webapp/uploads 。 然后,为了让你的web应用程序服务,只需将它作为新的Web应用程序上下文添加到服务器。

根据你以前的问题,我知道你正在使用Glassfish 3.1。 在这个服务器中,它被称为“虚拟主机”。 您可以在pipe理控制台中的http:// localhost:4848 > Configuration> HTTP Service> Virtual Servers上 ,或者在webapp级别,通过将以下行添加到/WEB-INF/glassfish-web.xml (你的IDE应该已经自动生成了一个;注意这个文件在Glassfish3.1之前叫做sun-web.xml ,所以如果你看到手册/博客/教程引用它,是的它是完全一样的文件):

 <property name="alternatedocroot_1" value="from=/uploads/* dir=/var/webapp" /> 

无论哪种方式,你应该能够通过<img>通常的方式使用http:// localhost:8080 / contextname / uploads / *来提供上传的图片。

也可以看看:

  • 如何使用JSP / Servlet将file upload到服务器?
  • 将上传的文件保存在servlet应用程序中的推荐方法 (包含Tomcatconfiguration示例)
  • 在servlet中读取/写入文本文件,这个文件应该存储在JBoss中? (包含JBossconfiguration示例)
  • 在Java Web应用程序中从应用程序服务器外部提供静态数据的最简单方法