富文本中的图片是存到阿里云中的,在数据库中整个富文本的内容是存在一个content字段中的,这样会带来一个问题:上传到阿里云的图片是带有过期时间的,这时就需要调用阿里云的函数,重新生成一个新的链接,但是在展示富文本内容时,是直接将content字段返给前端,里面的图片地址还是原先的(已过期),图片就展示不出来。
解决方法:
1.适用于非高并发场景:
我们的富文本的img标签保存的是完整的图片地址,在上传图片时就在该图片的前面加上路径,让其转到另一个接口,就可以获取到新的图片链接。
原先的img标签:
<img style="text-align:center;max-width:100%;" src="http://lz-sign.lezhireading.com/2021/12/24/1640313226703.jpg?Expires=1641784455&OSSAccessKeyId=LTAI4G56MHdEKBUNCHeRnQVi&Signature=Q8S1BDfDY1QQGiOmsSwDLaawOC4%3D" width="750" height="422" title="" align="left" alt="">
加上特定路径img标签
<img style="text-align:center;max-width:100%;" src="/dev-api/xx/xx/redirect?img=http://lz-sign.lezhireading.com/2021/12/24/1640313226703.jpg?Expires=1641784455&OSSAccessKeyId=LTAI4G56MHdEKBUNCHeRnQVi&Signature=Q8S1BDfDY1QQGiOmsSwDLaawOC4%3D" width="750" height="422" title="" align="left" alt="">
xx/xx 是controller层的路径
controller层代码:代码量少,这里就放到controller层了
/**
方法实现说明: 富文本图片重定向
*/
@RequestMapping(value = "/redirect",method = RequestMethod.GET)
public void redirect(HttpServletRequest request, HttpServletResponse response)
{
String img = request.getParameter("img");
if (Objects.nonNull(img)) {
if (img.indexOf("http") > -1) {
img=ossUtil.getTempUrlByOldUrl(img);
} else {
img=ossUtil.getURL(img);
}
}
try {
response.sendRedirect(img);
} catch (IOException e) {
e.printStackTrace();
}
}
新的问题来了:如何解析富文本内容(如何拿到img标签):
maven:
<!-- java解析富文本处理Img标签 -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
解析代码:
/**
* @Author: liup
* @date: 2022/1/4 15:56
方法实现说明: 编辑 新闻详情的富文本的img
*/
public String documentBody (String url) {
//javax.lang.model.element.Element javax.lang.model.util.Elements
Element doc = Jsoup.parseBodyFragment(url).body();
Elements pngs = doc.select("img[src]");
String imgIndexs=imgIndex+"/xx/xx/redirect?img=";
for (Element element : pngs) {
String imgUrl = element.attr("src");
if (!imgUrl.contains(imgIndexs)){
imgUrl =imgIndexs + imgUrl;
element.attr("src", imgUrl);
}
}
String content=doc.toString();
return content;
}
函数的参数传入content字段即可,imgIndex的值我放到了配置文件中,本地环境和测试环境都放了。 将返回值放到content字段中即可。