前言
最近真的被图片上传的功能给烦恼了。在web的项目中,我们经常会有上传图片的业务场景,最典型的是上传头像。为了解决头像上可以有如下的实现:
使用 multipart/form-data 上传用户信息和头像,也即是使用html里面的
。如 gitlab中修改用户信息的头像。先将图片上传到图片服务,并获取图片连接,之后再用这个图片连接修改用户信息。
直接上传图片的Base64编码信息,作为图片的数据,后台再将编码转化为图片文件。
这里将讨论的是第三中实现方法的中的图片与Base64编码互转。
在网页中,会有如下两种处理图片的方式,一种是直接src="/avatar/avatar.jpg",另一种则是 src="https://img-blog.csdnimg.cn/2022010703580471583.jpeg"的方式。第二种方式就是前端将发给后台的内容,数据由[数据描述],[数据Base64]组成,[数据描述]将告知我们该图片的类别,可以从中分析出图片的拓展名,[数据Base64]为图片Base64编码之后的数据,为图片文件完整的数据。为了能够完整地回复图片的内容和拓展名,需要前端发送[数据描述],[数据Base64]到后台。该格式其实是Data URI Scheme,完整后面再做讲解。
Insert title hereData URLs Image:
从 [数据描述] 判断图片拓展名
具体实现
数据描述与拓展名的映射
这里利用两个map,分别记录数据描述映射到拓展名和拓展名映射到数据描述,从而方便数据描述和拓展名的获取。
import java.util.HashMap;
import java.util.Map;
import java.io.File;
public class ImageDataURISchemeMapper {
private static Map scheme2Extension = new HashMap();
private static Map extension2Scheme = new HashMap();
static {
initSchemeSupported();
}
public static String getScheme(String imageExtension) {
if (imageExtension == null || imageExtension.isEmpty()) {
return "";
}
String result = extension2Scheme.get(imageExtension.toLowerCase());
return result == null ? "" : result;
}
public static String getScheme(File image) {
if (image == null) {
return "";
}
String name = image.getName();
int lastPointIndex = name.lastIndexOf(".");
return lastPointIndex < 0 ? "" : getScheme(name.substring(lastPointIndex + 1));
}
public static String getExtension(String dataUrlScheme) {
return scheme2Extension.get(dataUrlScheme);
}
public static String getExtensionFromImageBase64(String imageBase64, String defaultExtension) {
int firstComma = imageBase64.indexOf(",");
if(firstComma < 0) {