问题描述
APP端上传图片,使用base64转图片工具类的时候出现异常保存图片失败。而H5端却不会出现报错。
java.lang.IllegalArgumentException: Illegal base64 character d
Base64转图片工具类
package com.ckm.yangle.utils;
import org.springframework.context.annotation.Configuration;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Base64;
@Configuration
public class Base64ToImage {
// 对字节数组字符串进行Base64解码并生成图片
//imgFilePath 待保存的本地路径
public boolean GenerateImage(String base64Str, String imgFilePath) {
if (base64Str == null) // 图像数据为空
return false;
try {
// Base64解码
byte[] bytes = Base64.getDecoder().decode(base64Str);
for (int i = 0; i < bytes.length; ++i) {
if (bytes[i] < 0) {// 调整异常数据
bytes[i] += 256;
}
}
// 生成jpeg图片
OutputStream out = new FileOutputStream(imgFilePath);
out.write(bytes);
out.flush();
out.close();
//====
return true;
} catch (Exception e) {
System.out.println(e);
return false;
}
}
}
H5端的base64输出结果
APP端的base64输出结果
APP端写入失败
问题原因
由于APP端上传图片时转成的base64是MIME方式,而MIME方式输出隐射到MIME友好格式。输出每行不超过76字符,并且使用’\r’并跟随’\n’作为分割。编码输出最后没有行分割。
然而H5端是基本方式输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/。
解决方案
解决方法相对简单,只是将调用Base64解密的方式由getDecoder()替换成getMimeDecoder()后问题就得到了解决。
写入成功
更详细内容参考该篇 https://blog.csdn.net/qq_48455576/article/details/121295709