【问题标题】:Images to show with Vaadin 14使用 Vaadin 14 显示的图像
【发布时间】:2023-03-28 15:35:01
【问题描述】:

我写这篇文章是因为我需要一些帮助。 我无法根据应用程序中的特定路径显示图像。

基本上它在做什么:我有一个名为 Sector 的模块,每个 Sector 都可以有一个与之相关的图像。当我使用 Vaadin 的 Upload 组件时,我将图像的路径保存到我的数据库中的一个表中,以便它可以显示之前选择的图片。

图片的实际路径很奇怪,好像是 Vaadin 将图片复制到了一个动态随机文件夹中。它不能使用图像的实际路径似乎是合乎逻辑的。

但问题是:路径在数据库中输入正确,但是当我重新加载页面 (F5) 时,Vaadin 无法再显示图像。这让我很不高兴,因为它应该很好地显示出来。

Vaadin 使用上传的图片创建的路径:VAADIN/dynamic/resource/2/c1ef7b9d-8f2b-4354-a97e-fe1fd4e868e7/551434.jpg

如果有帮助,我可以放一些代码。

屏幕截图显示了我刷新浏览器页面后它在做什么。

The image is being uploaded

After refreshing the page

这是我处理上传图片的代码部分:

upload.addSucceededListener(e -> {
            Component component = createComponent(e.getMIMEType(),
                    e.getFileName(), buffer.getInputStream());
            showOutput(e.getFileName(), component, output);
            //imgUpload = (Image) component;
            InputStream inputStream = buffer.getInputStream();
            targetFile = new File(PATH + currentProjetId + "\\secteur" + currentSecId + "\\photoSec.png");
            try {
                FileUtils.copyInputStreamToFile(inputStream, targetFile);
            } catch (IOException e1) {
                e1.printStackTrace();
                Notification.show("Error");
            }
            System.out.println("PATH : " + targetFile.getPath());
        });

【问题讨论】:

  • 您必须存储上传的图像。这只是一个临时网址
  • 您能否修改问题并分享您如何处理上传的代码?
  • 我已经添加了处理上传的代码部分。

标签: java image upload vaadin vaadin14


【解决方案1】:

我认为您正在使用刷新视图时丢弃的内存资源。您必须获取文件的内容并将其保存在服务器文件系统目录内的文件中。这是一个例子:

FileBuffer receiver = new FileBuffer();
Upload upload = new Upload(receiver);
upload.setAcceptedFileTypes("text/plain");
upload.addSucceededListener(event -> {
    try {
      InputStream in = receiver.getInputStream();
      File tempFile = receiver.getFileData().getFile();
      File destFile = new File("/some/directory/" + event.getFileName());
      FileUtils.moveFile(tempFile, destFile);
      
    } catch (IOException e) {
      e.printStackTrace();
      Notification.show("Error").
    }
});

【讨论】:

  • 好的,谢谢。我已成功将图像保存到应用程序目录内的特定文件夹中(实际上它位于 src/main/resources/META-INF/resources/photos 中)。我在link 上读到它是静态图像的地方。但我现在无法从该路径创建图像。就像它不知道在哪里寻找图像一样。如果可以帮助您理解它,我可以放置一些有关路径以及如何创建图像的屏幕。如果我的英语不好,我很抱歉。
  • 在项目编译期间src/main/resources 被复制到target/classes 文件夹(在本例中为target/classes/META-INF/resources/photos),因此在执行期间您不会通过那里获取上传的文件作为资源。该文件应存储在文件系统的其他位置并从那里加载并制成StreamResource 以在执行期间提供服务。
  • 好吧,这对我来说有点模糊,是否有可能使用StreamResource 的东西举个例子?因为,据我了解,我无法从复制的文件创建图像,因为它没有存储在正确的位置。但是我应该在哪里以及如何存储它呢?
  • 目标文件可以在磁盘上的任何位置,然后您可以将其读取到 inputStream File imageFile = new File("my/downloaded/file.jgp"); -> InputStream targetStream = FileUtils.openInputStream(imageFile); 然后用于 StreamResource
  • 好吧,如果我理解正确的话: - 当用户上传图像时,我将文件复制到目录/home/user/photos 作为示例。 - 我将文件的路径存储在我的数据库中 - 当他转到我需要显示图像的视图时:我用图像创建一个InputStream,然后使用StreamResource 显示内容是这样吗?如果你知道的话,你能向我解释一下如何使用StreamResource 吗?顺便谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2023-03-24
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多