需求:项目环境是内网,导致放在oss里的图片访问不了,所以需要后端把图片的base64格式传给前端。
前端
前端对图片的处理,一般都用dataURL的方式
Data URL 由四部分组成:data,文件类型,base64标志位,base64数据。
<img src="data:image/png;base64,PHN2ZyB4bWxucz0iaHR0c......Ii8+PC9nPjwvc3ZnPg==">
后端
/**
* 返回文件base64
* @param column
* @return
* @throws IOException
*/
public static String ImageBase64(String column) throws IOException {
URL url1 = new URL(column);
// 打开连接
URLConnection con = url1.openConnection();
//设置请求超时为5s
con.setConnectTimeout(5 * 1000);
// 输入流
InputStream is = con.getInputStream();
BufferedImage bufferedImage = ImageIO.read(is);
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
//得到图片格式 png jpg
String[] split = column.split("\\.");
int i = split.length - 1;
String format = split[i];
ImageIO.write(bufferedImage, format, byteArrayOut);
//二进制
byte[] data = byteArrayOut.toByteArray();
BASE64Encoder base = new BASE64Encoder();
String encode = base.encode(data);
//删除 \r\n
encode = encode.replaceAll("\n", "").replaceAll("\r", "");
return "data:image/"+format+";base64," + encode;
}
添加了完整的格式:前端就能处理了
最后记录一下base64编码的知识
base64就是64个可打印的字符来标识8位的二进制数据的编码。
编码方式
由于64等于2的6次方,所以一个Base64字符实际上代表着6个二进制位(bit)。
然而,二进制数据1个字节(byte)对应的是8比特(bit),因此,3字节(3 x 8 = 24比特)的字符串/二进制数据正好可以转换成4个Base64字符(4 x 6 = 24比特)。
为什么是3个字节一组呢? 因为6和8的最小公倍数是24,24比特正好是3个字节。
具体的编码方式:
1.将每3个字节作为一组,3个字节一共24个二进制位
2.将这24个二进制位分为4组,每个组有6个二进制位
3.在每组的6个二进制位前面补两个00,扩展成32个二进制位,即四个字节
4.每个字节对应的将是一个小于64的数字,即为字符编号
5.再根据字符索引关系表,每个字符编号对应一个字符,就得到了Base64编码字符
参考链接:链接: https://www.cnblogs.com/jimojianghu/p/15993027.html