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

Jsf 上载的图像仅在刷新页面后可用,jsf,jakarta-ee,servlets,file-upload,refresh,Jsf,Jakarta Ee,Servlets,File Upload,Refresh,上传图片时,文件成功保存,路径设置成功。但表单提交后,上传的图像不会立即显示。只有在重新加载页面时,才会显示上载的图像 我正在保存上传的文件,如下所示: InputStream is; try { File file = new File("C:\\****\\*****\\Documents\\NetBeansProjects\\EventsCalendary\\web\\resources\\images\\uploadPhoto.png"); is = event.getF

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

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

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的部署文件夹中。这是一个不好的主意,也是因为以下三个主要原因:

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

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

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

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

    根据您之前的问题,我知道您正在使用Glassfish 3.1。在这个服务器中,它被称为“虚拟主机”。您可以在管理控制台的>配置>HTTP服务>虚拟服务器的服务器级别上配置它,或者在webapp级别上通过将以下行添加到
    /WEB-INF/glassfish WEB.xml
    (您的IDE应该已经自动生成了一个文件;请注意,该文件在名为
    sunweb.xml
    的Glassfish 3.1之前,因此,如果您看到手册/博客/教程引用它,那么它是完全相同的文件):

    
    
    无论采用哪种方式,您都应该能够使用*以通常的方式为
    上传的图像提供服务

    另见:
    • (包含一个Tomcat配置示例)
    • (包含JBoss配置示例)

    问题不在于你如何上传图像,而在于你如何处理和显示上传的图像。因此,请显示该图像的代码,而不是你如何上传图像。我编辑了问题并输入了代码。谢谢!它现在似乎工作得很好,但你提供的代码有一个更正,而不是因为“from”路径将被添加到“dir”路径。再次感谢。啊,对了。我修复了答案中的示例,感谢反馈。