Я уже много исследовал, и существует много информации об отдельных шагах того, что я пытаюсь сделать, но так как я не знаю, какую часть процедуры я не понимаю, я решил описать всю свою проблему.
Мы создаем веб-приложение на JSF и Java для университета.Частично это загрузка логотипа, который должен храниться в базе данных в виде строки, а затем снова считываться из базы данных и отображаться на веб-сайте.Процесс отображения, кажется, работает просто отлично, но я просто не могу заставить загрузку работать.
Это код .xhtml для формы ввода на веб-сайте:
<h:form enctype="multipart/form-data">
<h:inputFile id="i_logo" value="#{systemConfigBean.logo}"
<f:ajax listener="#{systemConfigBean.upload}" render="@form"/>
</h:inputFile>
</h:form>
выбранный файл читается Scanner
в методе upload()
базового компонента systemConfigBean
.DTO organisationData
, который передается на уровень DAO, имеет атрибут byte[]
, в котором логотип сохраняется следующим образом:
Scanner scanner = new Scanner(logo.getInputStream());
String fileContent = scanner.useDelimiter("\\A").next();
scanner.close();
organisationData.setLogo(fileContent.getBytes());
DAO преобразует его в строку Base64 и помещаетСтрока на базу данных.Строка создается следующим образом:
String encodedImage = Base64.getEncoder().encodeToString(organisation.getLogo())
До этого момента должна быть ошибка преобразования, потому что процедура отображения отсюда работает, если мы просто поместим закодированное изображение Base64 в базу данных.Так как мы можем ошибаться и декодирование и отображение могут быть некорректными, вот как мы обрабатываем эту часть:
В DAO:
organisationData.setLogo(Base64.getDecoder().decode(encodedImage))
В HTTP-сервлете:
response.setContentType(getServletContext().getMimeType(""));
response.setContentLength(logo.length);
response.getOutputStream().write(organisationData.getLogo());
Итак, мой вопрос: как нам получить правильное преобразование без изменения типа данных атрибута DTO logo
или каких-либо других изменений в архитектуре?
Так как это мой первый постна этом форуме, и я всегда открыт для предложений по улучшению, пожалуйста, дайте мне знать, если у вас есть какие-либо комментарии о том, как я могу улучшить свой пост.