在最近的项目开发过程中,我们需要将图片进行编码进行储存,或者将调取的文件转成图片进行传送,采用的转换方式则是通过Base64的编码,解码操作。
在平常的使用过程中,主要还是使用Base64进行代码的加密解密操作,记得上篇则是因为换行符的问题困惑的许久,(加密解密换行符问题)
图片解码操作:
在项目的开发过程中,我们需要进行接口调用的操作,将获取到的Base64文件编码成图片放到本地(或其他的位置):通过调用接口获取到的Base64
文件:“
/9j/4AAQSkZJRgABAgAAAQABAAD//gAKSFMwMQAvAACFBwCg0AD/2wBDABgQEhUSDxgVExUbGRgcJDwnJCEhJEk0Nys8V0xbWlVMVFJfa4l0X2WCZ1JUd6N5go6SmpuaXHOptKeVs4mXmpT/2wBDARkbGyQfJEYnJ0aUYlRilJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJS(由于过大,中间省略若干行)9LCxYZNN6TmgAz87U4LuQ00D52py8CgAQcUpyy80iffan/wAVAEePf9aKcSQetFAH/9k=”
具体代码:
/**
* @param xp 通过接口调用到的Base64格式文件
* @param idCardNo 身份证号
*/
public void photosUploadThread(String xp, String idCardNo) {
// 进行为空判断
if ("".equals(xp)) {
LogUtils.error(logger, "返回照片长度为0");
return;
}
// 存放文件位置
String rootPaht = "D:\\";
// 对身份证号进行加密操作
String enIdCardNo = DeEnCodeUtil.desEnCode(idCardNo);
// 取身份证号的部分进行路径标示,确保路径唯一
String dirPath = enIdCardNo.substring(0, 2) + "/" + enIdCardNo.substring(2, 4) + "/";
// 存放文件的位置组合
File f = new File(rootPaht + dirPath);
String fileName = enIdCardNo + ".png";
// 进行路径判断,是否存在
if (!f.exists()) {
LogUtils.info(logger, "路径不存在,开始创建路径");
f.mkdirs();
}
OutputStream out = null;
try {
// Base64解码操作方法
byte[] b = Base64Utils.decoderImage(xp);
File file = new File(f, fileName);
// 文件是否存在,进行判断
if (!file.exists()) {
LogUtils.info(logger, "文件不存在,开始创建文件");
file.createNewFile();
out = new FileOutputStream(file);
out.write(b);
} else {
LogUtils.info(logger, "文件存在,覆盖原文件");
out = new FileOutputStream(file);
out.write(b);
}
} catch (IOException e) {
LogUtils.error(logger, "上传身份证照片异常,证件号idCardNo=" + idCardNo, e);
} finally {
if (out != null) {
try {
out.flush();
out.close();
LogUtils.info(logger, "照片生成完毕,关闭流");
} catch (IOException e) {
LogUtils.error(logger, "上传身份证照片异常,证件号idCardNo=" + idCardNo + ",关流异常", e);
} finally {
out = null;
}
}
}
}
调用的Base64解码方法:
public static byte[] decoderImage(String s) throws IOException {
byte[] b = null;
if (s != null) {
@SuppressWarnings("restriction")
sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
@SuppressWarnings("restriction")
byte[] bytes = decoder.decodeBuffer(s);
for (int i = 0; i < bytes.length; ++i) {
if (bytes[i] < 0) {// 调整异常数据
bytes[i] += 256;
}
}
b = bytes;
}
return b;
}
这样,只要执行程序,对应的图片就会存入你写的对应的文件中去。
图片编码操作:
/**
* @param idCardNo
* @return
* @brief 照片下载方法
* @author - 2016年6月2日 霍亚静 创建初始版本
*/
public String photosDownloadThread(String idCardNo) {
String photoReturn = "";
String rootPaht = "D:\\";
String enIdCardNo = DeEnCodeUtil.desEnCode(idCardNo);
String dirPath = enIdCardNo.substring(0, 2) + "/" + enIdCardNo.substring(2, 4) + "/";
String fileName = enIdCardNo + ".png";
// 拼接图片读取路径
File f = new File(rootPaht + dirPath + fileName);
byte[] data = null;
// 读取图片字节数组
try {
InputStream in = new FileInputStream(f);
data = new byte[in.available()];
in.read(data);
// 调取图片编码
photoReturn = Base64Utils.encoderImage(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
return photoReturn;
}
调用的 Base64编码方法:
public static String encoderImage(byte[] data) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);// 返回Base64编码过的字节数组字符串
}
在我们的需求中,其实就是在需要的时候调用渠道获取图片进行保存,这样当同样的用户过来访问的时候,就可以直接从本地获取数据,同时获取对应的图片,减少了对渠道的调用,同时也方便上游的使用。这么多代码,其实核心代码就是那么几句。