对富文本中的阿里云图片进行重定向

富文本中的图片是存到阿里云中的,在数据库中整个富文本的内容是存在一个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&amp;OSSAccessKeyId=LTAI4G56MHdEKBUNCHeRnQVi&amp;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&amp;OSSAccessKeyId=LTAI4G56MHdEKBUNCHeRnQVi&amp;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字段中即可。

上一篇:python爬虫:爬取B站搜索内容


下一篇:Java 中正则表达式的详解