package controller;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class Base64ImgUtil {
/**
* 编码方法 ,jdk要求:1.8及以上
*/
public static String base64Encode(byte[] sorce) {
String encode = Base64.getEncoder().encodeToString(sorce);
return encode;
}
/**
* 解码方法,jdk要求:1.8及以上
*/
public static byte[] base64Decode(String sorce) {
byte[] decode = Base64.getDecoder().decode(sorce);
return decode;
}
/**
* 编码方法
*/
public static String base64Encode2(byte[] sorce) {
BASE64Encoder encoder = new BASE64Encoder();
String encode = encoder.encode(sorce);
return encode;
}
/**
* 解码方法
*/
public static byte[] base64Decode2(String sorce) {
BASE64Decoder decoder = new BASE64Decoder();
byte[] decode = null;
try {
decode = decoder.decodeBuffer(sorce);
} catch (IOException e) {
e.printStackTrace();
}
return decode;
}
/**
* 读取流中的数据到内存
*/
public static byte[] readToBytes(InputStream inStream) throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
// 创建一个Buffer字符串
byte[] buffer = new byte[10240];
// 每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
// 使用一个输入流从buffer里把数据读取出来
while ((len = inStream.read(buffer)) != -1) {
// 用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
// 关闭输入流
inStream.close();
// 把outStream里的数据写入内存
return outStream.toByteArray();
}
private static String[] imgTypes = { "png", "jpg", "jpeg", "ico", "gif" };
/**
* 获得Data URI Scheme前缀
*/
public static String getDUSPrefix(String imgType) {
for (String type : imgTypes) {
if (type.equals(imgType)) {
return "data:image/" + type + ";base64,";
}
}
return "data:image/jpeg;base64,";
}
/**
* 获得图片类型
*/
public static String getImgType(String imgPath) {
String type = imgPath.substring(imgPath.lastIndexOf(".") + 1);
return type.toLowerCase();
}
/**
* 通过图片路径将图片文件转为Base64编码字符串
*/
public static String convertImgToBase64ImgStr(String imgPath) throws IOException {
InputStream in = new FileInputStream(imgPath);
String imgType = getImgType(imgPath);
return convertImgToBase64ImgStr(in, imgType);
}
/**
* 图片流转Base64编码
*/
public static String convertImgToBase64ImgStr(InputStream in, String imgType) throws IOException {
byte[] bs = readToBytes(in);
String str = base64Encode(bs);
String prefix = getDUSPrefix(imgType);
return prefix + str;
}
/**
* 将Base64编码的图片字符串转为图片文件字节数组
*/
public static byte[] convertBase64ImgStrToBytes(String base64ImgStr) throws UnsupportedEncodingException {
base64ImgStr = base64ImgStr.substring(base64ImgStr.indexOf(',') + 1);// 例如:去除data:image/jpeg;base64,
byte[] base64ImgBytes = base64Decode(base64ImgStr);
return base64ImgBytes;
}
/**
* 获得Base64编码的图片字符串的图片类型信息
*/
public static String getImgTypeFormBase64Img(String base64ImgStr) {
String data = base64ImgStr.substring(0, base64ImgStr.indexOf(';'));
String type = data.substring(data.indexOf('/'));
return type;
}
// test
public static void main(String[] args) throws Exception {
String str = convertImgToBase64ImgStr("D:\\temp.jpg");
System.out.println(str);
byte[] bs = convertBase64ImgStrToBytes(str);
FileOutputStream fos = new FileOutputStream("D:\\temp2.jpg");
fos.write(bs);
fos.flush();
fos.close();
}
}
Tips:
目前,Data URI scheme支持的类型有:
data:,文本数据
data:text/plain,文本数据
data:text/html,HTML代码
data:text/html;base64,base64编码的HTML代码
data:text/css,CSS代码
data:text/css;base64,base64编码的CSS代码
data:text/javascript,Javascript代码
data:text/javascript;base64,base64编码的Javascript代码
data:image/gif;base64,base64编码的gif图片数据
data:image/png;base64,base64编码的png图片数据
data:image/jpeg;base64,base64编码的jpeg图片数据
data:image/x-icon;base64,base64编码的icon图片数据
什么是Base64:
https://blog.csdn.net/qq_22771739/article/details/90084526