Хранить фотографии в базе данных 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}}" />
надеюсь, это поможет кому-то !! спасибо.