项目中要使用富文本编辑,经过一轮筛选最终选择了国人开源的wangEditor(相对其他的富文本更简单,上手快文档也比较齐全)。使用的过程中发现一个问题,本地上传的图片如果按回退键删除了,服务器上还是存在。多余的话不多说,下面直接上代码。
1.使用正则表达式提取标签中的src
public static List<String> getImgUrl(String htmlStr) {
List<String> pics = new ArrayList<>();
if (org.apache.commons.lang3.StringUtils.isEmpty(htmlStr)) {
return pics;
}
String img = "";
Pattern p_image;
Matcher m_image;
// String regEx_img = "<img.*src=(.*?)[^>]*?>"; //图片链接地址
String regEx_img = "<img.*src\\s*=\\s*(.*?)[^>]*?>";
p_image = Pattern.compile
(regEx_img, Pattern.CASE_INSENSITIVE);
m_image = p_image.matcher(htmlStr);
while (m_image.find()) {
// 得到<img />数据
img = m_image.group();
// 匹配<img>中的src数据
Matcher m = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)").matcher(img);
while (m.find()) {
pics.add(m.group(1));
}
}
return pics;
}
2.从图片地址中提取图片ID,找出不存在的图片ID并删除
List<String> imageURLList=RegExpUtils.getImgUrl(content);
List<String> newImageIdList=new ArrayList<>();
String [] imageDomains=imageDomain.split(",");
if (imageURLList != null && !imageURLList.isEmpty()) {
imageURLList.stream().forEach(imageUrl->{
// 如果自己服务器上的图片
if (imageDomains.length>1) {
if (imageUrl.indexOf(imageDomains[0])!=-1 || imageUrl.indexOf(imageDomains[1])!=-1) {
String str[] = imageUrl.split("/");
newImageIdList.add(str[str.length - 2]);
}
}else if (imageDomains.length==1) {
if (imageUrl.indexOf(imageDomains[0])!=-1) {
String str[] = imageUrl.split("/");
newImageIdList.add(str[str.length - 2]);
}
}
});
}
List<String> unexists=new ArrayList<>();
// 找出不存在的图片ID
for (int i=0;i<images.size();i++) {
if (!newImageIdList.contains(images.get(i))) {
unexists.add(images.get(i));
}
}
message.setImages(newImageIdList);
unexists.stream().forEach(imageId->{
// 删除图片
imageService.deleteImageByImageID(imageId);
});