Я работаю над своим блогом и у меня возникли проблемы. Прежде всего, я могу загрузить любое изображение, а затем найти это изображение по id, преобразовать byte [] в String и отобразить его в браузере. У меня просто есть что-то вроде этого
Image imagesObj = imageService.getImage(id);
byte[] encode = Base64.getEncoder().encode(imagesObj.getImage());
model.addAttribute("image", new String(encode, "UTF-8"));
<img th:src="*{'data:image/jpg;base64,'+ image" alt="#" />
Я получил объекты Post и объекты Image, сопоставленные @OneToOne. Когда я делаю новое сообщение, идентификатор из изображения также присваивается сообщение. Теперь проблема в том, что когда я хочу отобразить все свои сообщения на главной странице с помощью:
@GetMapping("/")
public String mainPage(Model model) {
model.addAttribute("posts", postService.findAll());
return "main";
}
Я возвращаю весь объект Post, и он содержит postTitle, postContent и byte [] массив. Я нашел похожую проблему в этом вопросе Как отобразить массив байтов из модели в Thymeleaf Из этого поста я пришел с чем-то вроде этого:
@GetMapping("image/{id}")
public void getImageDetails(@PathVariable Long id, HttpServletResponse response) throws IOException {
response.setContentType("image/jpeg");
Image image = imageService.getImage(id);
InputStream is = new ByteArrayInputStream(image.getImage());
IOUtils.copy(is, response.getOutputStream());
//IOUtils(is, response.getOutputStream());
}
Thymeleaf
<img th:src="@{'image/{id}' + @{post.image()}}" alt="#">
Я пробовал также с post.getImage (). Я думаю об этом в течение некоторого времени, и не знаю, как мне решить эту проблему. Спасибо
ОБНОВЛЕНИЕ
Мне удалось найти решение, но это не очень хороший способ сделать это. Я читаю байты из файла, а затем преобразовываю его в строку и сохраняю изображение как строку в базе данных. Позже, когда я использую findAll()
, я могу читать изображение в тимелист.
byte[] image = file.getBytes();
byte[] encodeBase64 = Base64.getEncoder().encode(image);
String s = new String(encodeBase64, "UTF-8");
Сохранение строк в базу данных.
А в Thymeleaf я просто зацикливаюсь на объекте Post и проверяю значения* null
<img th:src="@{'data:image/jpeg;base64,'+${post?.getImage()?.getImageString()}}" alt="#"/>
Если у вас есть какие-либо советы, чтобы сделать его лучше, пожалуйста, дайте мне сейчас