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

时间:2012-01-16 19:24:39

标签: jsf java-ee servlets file-upload refresh

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

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

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

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

1 个答案:

答案 0 :(得分:41)

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

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

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

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

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

    根据您之前的问题,我知道您正在使用Glassfish 3.1。在这台服务器中,它被称为“虚拟主机”。您可以在http://localhost:4848 >的管理控制台中在服务器级别对其进行配置。配置> HTTP服务>虚拟服务器,或者在webapp级别通过将以下行添加到/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>方式提供上传的图片。

    另见: