首页 > 解决方案 > 将图像作为字符串转换为 byte[],然后再转换回 Base64 编码的字符串

问题描述

我已经研究了很多,并且有很多关于我尝试做的单个步骤的信息,但是由于我不知道程序的哪一部分我没有做对,所以我决定描述我的整个问题。

我们正在用 JSF 和 Java 为大学构建一个 Web 应用程序。其中一部分是徽标的上传,该徽标必须作为字符串存储在数据库中,然后再次从数据库中读取并显示在网站上。显示过程似乎工作得很好,但我就是无法让上传工作。

这是网站上输入表单的 .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>

所选文件由支持 beanScanner的方法中的 a 读取。传递给 DAO 层的 DTO有一个属性,徽标存储在其中,如下所示:upload()systemConfigBeanorganisationDatabyte[]

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-Servelet 中:

response.setContentType(getServletContext().getMimeType(""));
response.setContentLength(logo.length);
response.getOutputStream().write(organisationData.getLogo()); 

所以我的问题是,我们如何在不更改 DTO 属性的数据类型logo或对架构进行任何其他更改的情况下正确进行转换?

由于这是我在这个论坛上的第一篇文章,我总是乐于接受改进建议,如果您对如何改进我的帖子有任何意见,请告诉我。

标签: javajsftype-conversion

解决方案


推荐阅读