java - 将图像作为字符串转换为 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()
systemConfigBean
organisationData
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-Servelet 中:
response.setContentType(getServletContext().getMimeType(""));
response.setContentLength(logo.length);
response.getOutputStream().write(organisationData.getLogo());
所以我的问题是,我们如何在不更改 DTO 属性的数据类型logo
或对架构进行任何其他更改的情况下正确进行转换?
由于这是我在这个论坛上的第一篇文章,我总是乐于接受改进建议,如果您对如何改进我的帖子有任何意见,请告诉我。
解决方案
推荐阅读
- uitableview - 如何删除 Xamarin iOS 中每个单元格中的默认编辑图标
- ios - 轻量级问题:所有这些 Apple 首字母缩略词实际上代表什么?
- sql - Postgres Group 通过保留先前的顺序
- mongodb - 使用 volidator 创建 mongodb 集合,然后插入 doc 错误
- python - 检测图像边缘是否几乎是一条直线
- neural-network - Julia lang 错误:LoadError:UndefVarError:训练未定义
- r - ggplot2中的中心和偏移标签
- javascript - Vuex + firebase 数据库操作
- c++ - 为什么我不能在 C++ 中打印 NULL 地址
- android - 如何在 Android 上使用 OpenCV 和 Kivy 查看 RTSP 流