刷新页面后上传的图片才可用

Posted

技术标签:

【中文标题】刷新页面后上传的图片才可用【英文标题】:Uploaded image only available after refreshing the page 【发布时间】:2012-02-11 16:48:53 【问题描述】:

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

我将上传的文件保存如下:

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】:

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

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

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

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

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

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

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

无论哪种方式,您都应该能够使用http://localhost:8080/contextname/uploads/* 以通常的方式提供&lt;img&gt; 上传的图像。

另见:

How to upload files to server using JSP/Servlet? Recommended way to save uploaded files in a servlet application(包含Tomcat配置示例) Reading/writing a text file in a servlet, where should this file be stored in JBoss?(包含JBoss配置示例) Simplest way to serve static data from outside the application server in a Java web application

【讨论】:

谢谢!它现在似乎工作得很好,但是对您提供的代码进行了更正,而不是 它是 因为“from”路径将被添加到“dir”路径中。再次感谢。 对了。我修复了答案中的示例,感谢您的反馈。

以上是关于刷新页面后上传的图片才可用的主要内容,如果未能解决你的问题,请参考以下文章

怎么用ajax 提交上传的文件上传后在界面显示出来。但界面不刷新

令牌输入仅在我刷新页面后才有效

thinkphp调用页面后刷新没效果

ASP.NET 用AJAX在页面上传头像,不能异步刷新?

Chrome 和 IE8 上的 Jcrop 问题 - 仅在页面刷新时才显示裁剪

提交文件而不刷新页面[重复]