Хранить фотографии в базе данных H2 spring boot thymleaf

Добрый день. Я хочу сохранить изображение в базе данных h2, а затем получить и отобразить то же изображение на html-странице. Я использую spring boot и метод загрузки файлов, но я получаю ошибки в результатах привязки

вот страницы / классы:

4 ответов


то, что вы всегда можете сделать, это сравнить рабочий файл upload пример С уважением.

еще одна вещь, которая будет полезна для сравнения ваших входных имен с именем метода вашего контроллера ожидать ваш файл.

Если ваш опубликованный код по-прежнему актуален, вы можете найти имя "Fileimport" на входе в файл в шаблоне, но в вашем контроллере вы ожидаете файл ( @RequestParam(value="file", required=false) ).

другие вещи, которые помогают вы в отладке:

  • используя инструменты разработчика браузера и посмотрите, что вы отправляете через сеть
  • log входящих запросов на стороне сервера (либо таким образом, либо это слишком сложно для вас, вы можете просто перебирать имена параметров и регистрировать их (и, если возможно, их значения тоже)

Если это не помогло вам, то, пожалуйста, обновите сообщение: обновите свой код (шаблон + контроллер, если изменить) и дать использовать лучший stacktrace: на better я имею в виду, что вы должны показать не только последнюю строку N stacktrace, но, по крайней мере, до первой строки, где выполнение проходит через ваш код (другими словами, имя класса начинается с вашего пакета), даже лучше, если первое вызвано или второе, если оно имеет смысл).


Hi ваша форма Thymeleaf разрешена следующим образом атрибут name удаляется, если атрибут th: field присутствует

<form class="form-horizontal" action="/categories/upload" method="post" enctype="multipart/form-data">
    <input id="id" name="id" value="" type="hidden">
    <div class="form-group">
        <label class="col-sm-2 control-label">Category Name</label>
        <div class="col-sm-10">
            <input class="form-control" id="CategoryName" name="CategoryName" value="">
        </div>
    </div>
      <div class="form-group">
        <label class="col-sm-2 control-label">Category Photo</label>
        <div class="col-sm-10">
            <input name="CategoryPhoto" class="form-control" id="CategoryPhoto" type="file">
        </div>
    </div>
    <div class="row">
        <button class="btn btn-default">Save</button>
    </div>
</form>

который четко указывает на ошибку, которую вы получаете, даже если вы упоминаете как name= "file"во вводе файла, он разрешен для name=categoryPhoto из-за th:field="*{CategoryPhoto}", упомянутого после тега name.

использовать th: value= " ${product.name} "th:name= "name" th:id="name" вместо Th: поле будет более гибким


Spring переводит загруженные файлы как MultipartFile объекты, поэтому вы не можете сопоставить его непосредственно с массивом байтов.

вы можете получить массив байтов из MultipartFile с помощью MultipartFile#getBytes ().

в вашем случае вы можете использовать промежуточный объект (например,CategoryForm), где поле CategoryPhoto будет типа MultipartFile. Затем в вашем контроллере вы сопоставляете его с Category объект, который у вас уже есть, используя метод, который я показал выше.


вопросы решены просто скажите вам, что я сделал в моем случае:

1) Если вы загружаете один файл на страницу, то используйте файл части в качестве аргумента для отображения post в методе контроллера

2) к моей второй проблеме изображение не отображалось на html-странице с помощью thymeleaf, потому что я использую byte[] для сохранения в моей базе данных. Поэтому он не был решен thymeleaf. Поэтому я использовал двоичный кодек Apache commons Base64 (может быть добавлен как зависимость Gradle или Maven) для преобразуйте мое изображение byte[] в строку Base64, чтобы оно могло быть разрешено thymleaf. вот так:

    Category category = categoryService.findbyID(id);
    byte[] image = category.getCategoryPhoto();
    String CatImage =  Base64.encodeBase64String(image);

тогда в HTML

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

надеюсь, это поможет кому-то !! спасибо.