线上图片验证码性能优化base64编码
背景
项目中发现,img标签中写src,读取一个png图片,只有16kb,速度特别慢。图片是以https链接的方式请求的。
解决办法
将图片url链接转为base64编码格式,然后返回给前端,速度提升特别快。
定义:base64是一种基于64个可打印字符(A-Z、a-z、0-9、+、/)来表示二进制数据的表示方法,末尾用=做后缀。
原代码
byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(imageCode.getImage(), "jpeg", byteArrayOutputStream);
String fileName = UUID.randomUUID() + ".jpeg";
ResponseEntity<String> upload = fileUploadAndDownLoadService.upload(byteArrayOutputStream.toByteArray(), fileName);
JSONObject body = new JSONObject(upload.getBody());
JSONObject data = new JSONObject(body.get("data"));
TempFile tempFile = new TempFile();
tempFile.setFileName(fileName);
tempFile.setFileUrl(data.get("url").toString());
tempFile.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
tempFile.setDeleteStatus(0);
tempFile.setCreateTime(new Date());
tempFileMapper.insertSelective(tempFile);
return tempFile.getFileUrl();
优化后代码
byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(imageCode.getImage(), "jpeg", byteArrayOutputStream);
// 获取图片的字节数组
byte[] imageBytes = byteArrayOutputStream.toByteArray();
// 将字节数组转换为 Base64 字符串
String base64Image = Base64.getEncoder().encodeToString(imageBytes);
String fileName = UUID.randomUUID() + ".jpeg";
//ResponseEntity<String> upload = fileUploadAndDownLoadService.upload(byteArrayOutputStream.toByteArray(), fileName);
//JSONObject body = new JSONObject(upload.getBody());
//JSONObject data = new JSONObject(body.get("data"));
TempFile tempFile = new TempFile();
tempFile.setFileName(fileName);
//tempFile.setFileUrl(data.get("url").toString());
tempFile.setFileUrl(fileName);
tempFile.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
tempFile.setDeleteStatus(0);
tempFile.setCreateTime(new Date());
tempFileMapper.insertSelective(tempFile);
//return tempFile.getFileUrl();
return base64Image;
Base64 的应用场景包括:
常用于在 HTTP 协议中传输二进制数据。例如音乐文件里面保存一张封面图片,就是通过 base64 来进行保存。就是把一张图片或文件,变成一串字符串,这样就可以直接把这个字符串保存到数据库中,这种编码通常用于在网络中传输二进制数据,如图片或文件。
base64对于前端来说并不陌生,在性能优化方面,base64经常被用于小图片的转化,从而达到减少http请求,使得页面的性能变得越来越好。
优点
因为它可以避免数据在不同系统间传输时被误解或破坏;
同时无需借用一个空间进行存储,然后再通过地址获取到这个图片或者文件资源。
缺点
通过base64转化后,体积会大了 1/3 。
虽然Base64编码可以在一定程度上隐藏原始数据,但它并不提供任何加密功能。如果需要保护数据内容的安全,还需采用其他的加密技术。因为它的编码与解码过程是确定且公开的