Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
一、Base64文件
在项目中,数据库中存放文件使用的是mediumblob类型的二进制格式,这里用file_stream字段来表示,在java后台中的mysql返回参数中使用cast(file_stream as char)转为base64。
目前存放的有三类文件,分别是图片、word、pdf。理论上来说,将Base64文件的字符串直接输入到浏览器的地址栏中就可以直接访问,但是发现超过一定大小的文件就没办法直接在浏览器中打开了,所以需要通过后台将Base64文件下载到本地查看。
Base64图片文件的格式如下:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATEAAAElCAYAAACMItXlAAAgAElEQVR4nO2dB5RURdqGa8g5g+QMklSQbCArSYK7IMlfFAUFDJgTCouKAWWVlSyKuwKC7EpUVKJZokrOOecokuY/bzGNMEz...
二、下载Base64文件
思路解析:将Base64解码为字节数组->将字节数组通过FileOutputStream输出到文件
- 首先我们需要借助Base64工具类
import java.io.IOException;
public class Base64Utils {
/**
* 编码
* @param content
* @return
*/
public static String encode(byte[] content) {
return new sun.misc.BASE64Encoder().encode(content);
}
/**
* 解码
* @param source
* @return
*/
public static byte[] decode(String source) {
try {
sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
return decoder.decodeBuffer(source);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
- 将Base64字符串进行解码为字节数组,并输出到本地图片(PDF、docx等其他格式文件同理)
public static void main(String[] args) {
// 若没有base64字符串做测试,则可以用本地文件转base64进行实验
// File file = new File("E:\\test.txt");
// byte[] bFile = new byte[(int) file.length()];
String base64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATEAAAElCAYAAACMItXlAAAgAElE...";
// 使用Base64Utils的decode方法进行解码
byte[] fileBytes = Base64Utils.decode(base64);
try (FileOutputStream fileOuputStream = new FileOutputStream("D:\\1.png")) {
fileOuputStream.write(fileBytes);
} catch (IOException e) {
e.printStackTrace();
}
}
三、总结
难点在于Base64文件的下载需要先解码再转File下载,并且需要对Base64有一定的理解。
参考资料: