JAVA图片转字节流存入数据库,并可以取出显示在网页中

JAVA图片转字节流存入数据库,并可以取出显示在网页中

往数据库中存图片一般有两种方式。

  1. 存入图片路径
  2. 把图片以二进制数据流的形式直接写入数据库字段中。

但在不同的服务器上事,图片还是有点占地方的,所以我想直接把图片存入数据库中。然后取出再转为图片的。

我使用的是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代表用户ID

    PS:

    ​ 如果HttpServletResponse对象无法创建,那么需要导入servlet-api.jar

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值