JAVA图片转字节流存入数据库
JAVA图片转字节流存入数据库,并可以取出显示在网页中
往数据库中存图片一般有两种方式。
- 存入图片路径
- 把图片以二进制数据流的形式直接写入数据库字段中。
但在不同的服务器上事,图片还是有点占地方的,所以我想直接把图片存入数据库中。然后取出再转为图片的。
我使用的是SSM框架、MySQL数据库,取出图片可以直接在网页中显示。该方法也适用于web项目中
1.图片文件转字节流再存入数据库
- 转字节流
public static byte[] setImage(File file) {
FileInputStream fin = null;
byte[] bytes = null;
try {
fin = new FileInputStream(file);
//可能溢出,简单起见就不考虑太多,如果太大就要另外想办法,比如一次传入固定长度byte[]
bytes = new byte[fin.available()];
//将文件内容写入字节数组,提供测试的case
fin.read(bytes);
fin.close();
} catch (Exception e) {
e.printStackTrace();
}
return bytes;
}
当图片转换为字节流之后就可以直接存入数据库中。
2.图片取出之后在web端显示
我这里用的是springmvc,打算做的事根据用户ID获取头像
-
首先创建一个类用来把数据库中取出的字节流转换为图片
public static Image getImage(byte[] bytes) { Image img = null; try { InputStream isPhoto = new ByteArrayInputStream(bytes); img = ImageIO.read(isPhoto); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return img; }
这里把自己留转换为一个
Image
对象,是java.awt`中的Image处理response信息
@GetMapping("getHeadImg/{id}") public BufferedImage MakeHeadImg(@PathVariable String id, HttpServletResponse response) { response = ImageConversion.httpServletResponse(response); List<User> img = userService.getHeadImg(id); BufferedImage image = null; if (img.size() != 0) { image = (BufferedImage) ImageConversion.getImage(img.get(0).getHeadimg()); Graphics graphics = image.getGraphics(); // Image x坐标 y坐标 图片宽度 图片高度 ** graphics.drawImage(image, 0, 0, image.getWidth(null), image.getHeight(null), null); graphics.dispose(); try { ImageIO.write(image, "JPEG", response.getOutputStream()); if (response.getOutputStream() != null) { response.getOutputStream().close(); } } catch (IOException e) { e.printStackTrace(); } } return image; }
然后再Controller中做一些处理。
下面是完整的Controller代码
@GetMapping("getHeadImg/{id}") public BufferedImage MakeHeadImg(@PathVariable String id, HttpServletResponse response) { response = ImageConversion.httpServletResponse(response); List<User> img = userService.getHeadImg(id); BufferedImage image = null; if (img.size() != 0) { image = (BufferedImage) ImageConversion.getImage(img.get(0).getHeadimg()); Graphics graphics = image.getGraphics(); // Image x坐标 y坐标 图片宽度 图片高度 ** graphics.drawImage(image, 0, 0, image.getWidth(null), image.getHeight(null), null); graphics.dispose(); try { ImageIO.write(image, "JPEG", response.getOutputStream()); if (response.getOutputStream() != null) { response.getOutputStream().close(); } } catch (IOException e) { e.printStackTrace(); } } return image; }
然后再前台直接输入
<img src="项目访问地址/getHeadImg/1" />
其中数字
1
代表用户IDPS:
如果
HttpServletResponse
对象无法创建,那么需要导入servlet-api.jar