刷新页面后才能查看已上传的图片

19

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

以下是我保存上传文件的代码:

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());
}
上传的图片为何只有在重新加载页面后才显示,如何解决?

问题不在于您如何上传图像,而是在于您如何处理和显示已上传的图像。因此,请展示有关此方面的代码,而不是上传图像的代码。 - BalusC
我编辑了问题并放置了代码。 - Rodrigo Cavalcante
1个回答

45

您将文件直接写入IDE项目文件夹中,而您的意图似乎是将其保存在Web应用程序的部署文件夹中。这是一个不好的想法,有以下3个主要原因:

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

  2. 在实际的代码中,存储上传的文件在Web应用程序的部署文件夹中有时根本行不通。有些服务器(默认情况下或通过配置)不会将部署的WAR文件扩展到本地磁盘文件系统中,而是完全在内存中。您无法在内存中创建新文件,除非基本上编辑部署的WAR文件并重新部署它。

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

您需要将其写入项目/部署文件夹之外的固定路径中。例如,/var/webapp/uploads。然后,只需将其作为新的Web应用程序上下文添加到服务器中即可通过Web应用程序提供服务。

根据您之前的问题,我知道您正在使用Glassfish 3.1。在该服务器中,它称为“虚拟主机”。您可以在管理控制台中的服务器级别配置它,位于http://localhost:4848> Configuration> HTTP Service> Virtual Servers 或者在Web应用程序级别通过向/WEB-INF/glassfish-web.xml添加以下行来完成(您的IDE应该已自动生成一个;请注意,此文件在Glassfish 3.1之前称为sun-web.xml,因此如果您看到有关它的手册/博客/教程,请确保这是完全相同的文件):

<property name="alternatedocroot_1" value="from=/uploads/* dir=/var/webapp" />
不管怎样,您应该能够使用http://localhost:8080/contextname/uploads/*来按照通常的方式通过<img>标签加载那些已上传的图片。

另请参阅:


1
谢谢!现在看起来运行得相当不错,但是你提供的代码需要进行更正,应该是<property name="alternatedocroot_1" value="from=/uploads/* dir=/var/webapp" />而不是<property name="alternatedocroot_1" value="from=/uploads/* dir=/var/webapp/uploads" />,因为“from”路径将被添加到“dir”路径中。再次感谢。 - Rodrigo Cavalcante
好的,我已经修复了答案中的示例,感谢您的反馈。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接