上传的图片在Spring Mvc中不会显示直到我刷新页面

10

我正在使用Spring MVC和Thymeleaf上传图像到服务器,并在提交表单后在一个名为“result”的单独页面中显示它。

问题是,图像在我刷新Spring Tool Suite中的“resources/static/images”文件夹并刷新页面之前不会显示出来。我修改了Eclipse工作区选项以进行自动刷新,IDE部分解决了,但仍需要刷新结果页面才能显示图像。

这是控制器代码:

@RequestMapping(value = "/save", method = RequestMethod.POST)
public String contentSubmit(@Valid @ModelAttribute ContentEntity cm, BindingResult result,
        @RequestParam("file") MultipartFile file, Model model) {
    if (!file.isEmpty()) {
        try {
            cm.setImgUrl(file.getOriginalFilename());
            byte[] bytes = file.getBytes();
            BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(new File("src/main/resources/static/images/"+cm.getImgUrl())));
            stream.write(bytes);
            stream.close();
        } catch (Exception e) {
            //return error page
        }
    }

    if (result.hasErrors()) {
        return "cms";
    }

    contentDao.addContent(cm);
    return "view";
}

这是视图代码。

<img th:src="@{'images/'+${contentEntity.imgUrl}}" class="image-responsive thumbnail" />

3
服务器不会从 src/main/resources/ 目录中提供图像。它们是通过从该目录(以及其他目录)构建的 Web 应用程序提供的。将 Web 应用程序视为一个大的 war 文件,你无法在运行时修改它(因为这就是它应该的样子)。将上传的图像视为数据,在生产 Web 服务器上存储在 应用程序之外 或数据库中,因为它们就是这样。你需要一个 Servlet 或 Controller 来获取图像 ID,读取相应的文件或数据库 blob,并使用适当的内容类型将数据发送回浏览器。 - JB Nizet
我曾经遇到过同样的问题。我通过遵循这篇文章解决了它。所以现在我想知道这个问题是否也会发生在服务器(生产状态)中,或者这只是本地环境(开发状态)的问题?保存图像/文件的过程是否安全? - Partho63
2个回答

7
您正在实际创建一个资源(图像文件)在“src/resources/…”目录中。然而,似乎您的服务器正在从不同的目录(比如target/**或bin/**)提供图像。因此,当您刷新资源目录时,STS会检测到新文件已经被创建,并将该文件复制到目标目录下。
在eclipse中有一个选项“本地钩子或轮询”,它会不断监视资源的更改(即使是在STS/eclipse之外进行的更改)。一旦检测到更改,资源将自动刷新。
您可以通过以下方式设置此选项:首选项>常规>工作区>“使用本机钩子或轮询刷新”。

enter image description here

希望这能帮到你。

2
这可能在服务器(生产状态)中发生吗,还是只是本地环境(开发状态)的问题?保存图像/文件的过程是否安全? - Partho63

0
另一种解决方法是,不仅可以将图像存储在 resources/static/images 中,还可以将它们保存在 target/classes/static/images 中,这样服务器就能够看到新添加的图片而无需刷新。

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