Я работаю над проектом, и я использую Thymeleaf со Spring для создания веб-страниц, но мне кажется, что создание изображений не работает должным образом.

У меня они есть в базе данных, поэтому они генерируются нормально (в «сгенерированную» - папку).

enter image description here

Итак, зайдя на страницу «Проекты», изображения должны быть там, но они не будут отображаться во Frontend, пока я не переключу Intellij, не вернусь в браузер и не нажму «Обновить» еще раз. Я никогда не видел такого странного поведения. Может, мне чего-то не хватает в Тимелеафе? Потому что пользуюсь им впервые.

FILE_UPLOAD_ROOT - читается из application.properties , и это src / main / resources / generated /

Затем мой контроллер передает этому методу список проектов:

/**
 * Each entity that will extend {@link MediaModel} can use this method as a helper. In other words,
 * we should have these three fields added to the table that we're going to use:
 * pic(LONGBLOB), pic_name(VARCHAR), pic_type(VARCHAR)
 *
 * @param itemsList - database results for that we are going to generate images
 */
 public static void generateImages(Iterable<? extends MediaModel> itemsList) {

    itemsList.forEach(item -> {
        try {
            if (item.getPicName() == null) {
                return;
            } else {
                Files.write(Paths.get(FILE_UPLOAD_ROOT + item.getPicName() + "." + item.getPicType()), item.getPic());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    });
}

В Тимелеафе у меня есть: Я не совсем уверен, почему, но изображения не берутся непосредственно из папки сгенерированный , я должен указать только корень, в любом случае Thymeleaf не сможет их показать вообще.

<img th:src="@{/{picName}.{picType}(picName=${project.picName},picType=${project.picType})}"/>

Схема MySQL, содержащая изображения проектов

create table projects
(
    id          bigint       not null
        primary key,
    created_at  datetime(6)  not null,
    updated_at  datetime(6)  not null,
    pic         longblob     null,
    pic_name    varchar(255) null,
    pic_type    varchar(255) null,
    category_id bigint       not null,
    constraint FKmagkis2tpqxxx8hq100rjo92v
        foreign key (category_id) references projects_categories (id)
            on delete cascade
);

enter image description here

И когда я пытаюсь получить доступ к странице, есть это, пока я не вернусь к Intellij:

enter image description here

P.S. Да, я попытался развернуть его на удаленном сервере, но не вижу их вообще, но я заглянул в целевую папку, и там есть изображения.

0
Denees 9 Дек 2019 в 23:23

1 ответ

Почему вы хотите хранить изображения из базы данных в папке внутри вашего заархивированного war или jar? Это не желательно

Либо храните образы вне упаковки, развертываемые на сервере, и используйте их оттуда.

ИЛИ

Просто используйте тег изображения, как показано ниже, и визуализируйте изображения на лету

<img alt="img"  th:src="@{'data:image/jpeg;base64,'+${Base64EncodedImage}}" />

P.S. - работа в IDE отличается от работы с приложением на сервере. Ваш подход будет работать в IDE, но не на сервере

1
Defaulter 11 Дек 2019 в 13:01
Да, я подошел к этому, но не могу отобразить их в Thymeleaf, как мне сопоставить изображения вне папки ресурсов? пытаясь сделать это максимально динамически
 – 
Denees
11 Дек 2019 в 16:31
Это потому, что вы хотите снизить затраты базы данных на запросы изображения? Тогда почему бы не иметь бесплатные URL-адреса хостинга изображений вместо хранения изображений в базе данных.
 – 
Defaulter
11 Дек 2019 в 17:54
Нет, потому что мне нужно слишком много рефакторинга, чтобы он работал по принципу Base64.
 – 
Denees
11 Дек 2019 в 17:59
1
Возможно, вы можете посмотреть mkaroune.e-monsite.com/pages/spring/…. Хотя я бы предпочел использовать подход Base64, потому что его легко преломлять, и это будет пуленепробиваемое решение.
 – 
Defaulter
12 Дек 2019 в 08:14
Спасибо я посмотрю
 – 
Denees
12 Дек 2019 в 19:47