将byte[]数组上传到数据库,从数据库还原byte[]数组为img图片
今天碰到的需求是将图片文件存入数据库,而不是存储一个图片访问的URL,不知道有没有人遇到跟我一样的需求,查询过javaAPI后使用ByteArrayOutputStream 和ByteArrayInputStream实现了该功能,测试代码如下:
目标文件为D://11.png
1.将本地图片转换为byte数组,并存放数据库
@Test
public void insertUser() {
//获取sqlsession(MySqlsessionFactory为我自己配置的工厂类)
SqlSession sqlSession = MySqlSessionFactory.getSqlSession();
try {
//断言sqlSession非空
assert sqlSession != null;
//获取userMapper映射对象
SysUserMapper userMapper = sqlSession.getMapper(SysUserMapper.class);
SysUser sysUser = new SysUser();
//创建文件输入流
FileInputStream fis = new FileInputStream("d://11.png");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedImage read = ImageIO.read(fis);
ImageIO.write(read, "png", baos);
//将目标文件转换成byte数组
byte[] bytes = baos.toByteArray();
//设置pojo属性
sysUser.setHeadImg(bytes);
sysUser.setUserInfo("测试-带图片");
sysUser.setEmail("[email protected]");
sysUser.setCreateTime(new Date());
sysUser.setPassword("1111111");
sysUser.setUserName("测试用户");
//添加进数据库
userMapper.insertUser(sysUser);
//提交
sqlSession.commit();
fis.close();
baos.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
assert sqlSession != null;
sqlSession.close();
}
}
存放成功后的数据库为:
2.将数据库中head_img文件读取并保存到C://22.png
@Test
public void testDownLoadImgFromDataBase() {
//获取session会话
SqlSession sqlSession = MySqlSessionFactory.getSqlSession();
try {
//断言非空
assert sqlSession != null;
//获取映射对象
SysUserMapper userMapper = sqlSession.getMapper(SysUserMapper.class);
//按id查询用户信息
SysUser sysUser = userMapper.findUserById(1004L);
//读取从数据库查到的用户头像
ByteArrayInputStream bais = new ByteArrayInputStream(sysUser.getHeadImg());
BufferedImage read = ImageIO.read(bais);
//写出数据到C://22.png
ImageIO.write(read, "png", new FileOutputStream(new File("C://22.png")));
bais.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
assert sqlSession != null;
sqlSession.close();
}
}
最后结果如下:
记录完毕