项目里用到的,做一下笔记。
@Value("${TemplateImg.Url}") //存储路径我放到配置文件中了,你们也可以自己改成自己的路径,下面会用到
private String innerImg;
//分隔符
private static String separator = "/";
/**
* 修改、保存
* @param pfTemplate
* @param model
* @param redirectAttributes
* @return
* @throws BadPaddingException
* @throws Base64DecodingException
*/
@RequiresPermissions(value = { "pft:pfTemplate:add", "pft:pfTemplate:edit" }, logical = Logical.OR)
@RequestMapping(value = "save")
public String addPfTemplate(PfTemplate pfTemplate,Model model, RedirectAttributes redirectAttributes) throws BadPaddingException, Base64DecodingException{
PfTemplate pft = pfTemplateService.get(pfTemplate.getId());
if(pft == null) {
String guid = UUID.randomUUID().toString().replace("-", "");
pfTemplate.setId(guid);
String pcBase64 = pfTemplate.getPcImg();
String appBase64 = pfTemplate.getAppImg();
if(StringUtils.isNotBlank(pcBase64) && pcBase64 != null) {
String pcImg = saveImg(pcBase64);
pfTemplate.setPcImg(pcImg);
}
if(StringUtils.isNotBlank(appBase64) && appBase64 != null) {
String appImg = saveImg(appBase64);
pfTemplate.setAppImg(appImg);
}
int rows = pfTemplateService.insertTemplate(pfTemplate);
if(rows >0) {
addMessage(redirectAttributes, "添加服务表单模板成功");
}
}else {
String pcStr = pfTemplate.getPcImg();
String appStr = pfTemplate.getAppImg();
//TestIsBase64 此方法用来判断是不是base64,是的话说明图片更换了,不是就说明图片没有更换
Boolean pcIsBase = TestIsBase64(pcStr);//判断pc有没有更改图片
Boolean appIsBase = TestIsBase64(appStr); // 判断app 有没有更改图片
if(pcIsBase) {
//String str = innerImg+pft.getPcImg();
new File(innerImg+pft.getPcImg()).delete(); //如果图片更换了就删除原来的图片 如果原来图片已经删了也不用管不会报错,
String pcImg = saveImg(pcStr);//将新图片转化路径保存到数据库
pfTemplate.setPcImg(pcImg);
}
if(appIsBase) {
new File(innerImg+pft.getAppImg()).delete();
String appImg = saveImg(appStr);
pfTemplate.setAppImg(appImg);
}
int rows = pfTemplateService.updateTemplate(pfTemplate);
addMessage(redirectAttributes, "修改服务表单模板成功");
}
return "redirect:" + adminPath + "/pft/pfTemplate/?repage";
}
/**
* base64保存到指定位置,并返回路径
* @param baseImg
* @return
* @throws BadPaddingException
* @throws Base64DecodingException
*/
public String saveImg(String baseImg) throws BadPaddingException, Base64DecodingException {
//定义一个正则表达式的筛选规则,为了获取图片的类型
String rgex = "data:image/(.*?);base64";
String type = getSubUtilSimple(baseImg, rgex);
//去除base64图片的前缀
baseImg = baseImg.replaceFirst("data:(.+?);base64,", "");
byte[] b;
byte[] bs;
OutputStream os = null;
String fileName = "";
String nowDate = "";
// 格式化并获取当前日期(用来命名)
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
nowDate = format.format(new Date());
//把图片转换成二进制
b = Base64.decode(baseImg.replaceAll(" ", "+"));
//生成路径
String path = innerImg + separator + "TemplateImg" + separator + nowDate + separator;
//随机生成图片的名字,同时根据类型结尾
fileName = UUID.randomUUID().toString() + "." + type;
File file = new File(path);
if (!file.exists() && !file.isDirectory()) {
file.mkdirs();
}
File imageFile = new File(path + "/" + fileName);
BASE64Decoder d = new BASE64Decoder();
// 保存
try {
bs = d.decodeBuffer(Base64.encode(b));
os = new FileOutputStream(imageFile);
os.write(bs);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.getLocalizedMessage();
}
}
}
return "TemplateImg" + separator + nowDate + separator + fileName;
}
public static String getSubUtilSimple(String soap,String rgex){
Pattern pattern = Pattern.compile(rgex);
Matcher m = pattern.matcher(soap);
while(m.find()){
return m.group(1);
}
return "";
}
/**
判断是否是base64
*/
public Boolean TestIsBase64(String str) {
String baseStr = str;
String base64Pattern = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
if (baseStr.lastIndexOf(",") != -1) {
baseStr = baseStr.substring(baseStr.lastIndexOf(",") + 1);
}
Boolean isLegal = baseStr.matches(base64Pattern);
return isLegal;
}