JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库

转载自  JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库

开发环境:struts2+ spring + hibernate

数据库:oracle

需求:在HTML编辑器中输入文章,传入后台,文章中所有图片路径,转换成base64编码,将文章存入数据库中的CLOB字段。

知识点:HTML编辑器,html解析,base64编码,String到CLOB类型转换

 

        一般情况下,数据库只需要保存图片的路径就可以了,图片文件放在项目文件夹中,显示时只需加载图片路径即可。但是时下信息共享的渠道太多了 ,当IOS,android,微信公众号都操作同一个数据库的时候,上述方案是无法加载到图片的。因此我想到一个办法就是上传图片后,将路径替换为base64编码,存入数据库即可。

       我使用的编辑器是kindeditor,演示内容:

 



 备注:kindeditor上传图片的功能会和struts2会有冲突,因为struts2过滤jsp时会改变request类型,解决方法链接http://blog.csdn.net/kunkun378263/article/details/23274369

 

文章内容传到后台后,调用HTML解析类的编码方法 ,并用hibernate的createClob方法将String 转成CLOB,添加到数据库。

Action方法:

  1. public String add(){  
  2.         String content = request.getParameter("content");  
  3.         Clob clob =Hibernate.createClob(HtmlJsoup.html_ImgToBase64(content));  
  4.         article.setContent(clob);  
  5.         service.add(article);  
  6.   
  7.                 return SUCCESS;  
  8.     }  

 

我使用的HTML解析器是jsoup,类名和方法名都是和javaScript相类似的,对于会jquery的同学简直是福音,非常好理解非常好用,下面是我自己写的HTML解析类的代码,在转码前还会调用一个使用了正则表达式的方法用于检测路径是否为有效路径。

  1. import java.io.File;  
  2. import java.util.regex.Matcher;  
  3. import java.util.regex.Pattern;  
  4. import org.apache.struts2.ServletActionContext;  
  5. import org.jsoup.Jsoup;  
  6. import org.jsoup.nodes.*;  
  7. import org.jsoup.select.Elements;  
  8.   
  9. public class HtmlJsoup {  
  10.   
  11.     /** 
  12.      * 检测图片路径是否为真实有效的路径方法 
  13.      * @param src 
  14.      * @return 
  15.      */  
  16.     public static boolean checkImage(String src){  
  17.   
  18.           
  19.         //使用正则表达式,排除img标签src属性值已经是base64编码的情况  
  20.         Pattern pattern = Pattern.compile("^data:image/(png|gif|jpg|jpeg|bmp|tif|psd|ICO);base64,.*");  
  21.         Matcher matcher = pattern.matcher(src);  
  22.         if(matcher.matches())  
  23.             return false;  
  24.         //排除src路径并非图片格式的情况  
  25.         pattern=Pattern.compile("^.*[.](png|gif|jpg|jpeg|bmp|tif|psd|ICO)$");  
  26.         matcher = pattern.matcher(src);  
  27.         if(!matcher.matches())  
  28.             return false;  
  29.         //排除图片路径不存在的情况  
  30.         String path = ServletActionContext.getServletContext().getRealPath(src.substring(5, src.length()));  
  31.         File file = new File(path);  
  32.         if(!file.exists())  
  33.             return false;  
  34.       
  35.         return true;  
  36.     }  
  37.     public static String html_ImgToBase64(String html){  
  38.         Document doc = Jsoup.parse(html, "utf-8");  
  39.         Elements imgs = doc.getElementsByTag("img");  
  40.           
  41.         for(Element img :imgs){  
  42.             String src = img.attr("src");  
  43.               
  44.             if(!checkImage(src))  
  45.                 continue;  
  46.             //将有效的路径传入base64编码的方法  
  47.             img.attr("src",ImageBase64.imageToBase64Head(src));  
  48.               
  49.         }  
  50.           
  51.         //返回base64编码后的html文档  
  52.         return doc.getElementsByTag("body").html();  
  53.     }  
  54. }  

 

最后是图片转base64的编码类代码,记得要带上头文件,不然显示时无法识别。

  1. import java.io.*;  
  2. import org.apache.commons.codec.binary.Base64;  
  3. import org.apache.struts2.ServletActionContext;  
  4.   
  5.   
  6. public class ImageBase64 {  
  7.        
  8.      /** 
  9.       * 将图片转换成Base64编码 ,带头文件 
  10.       * @param imgFile 待处理图片 
  11.       * @return 
  12.       */  
  13.      public static String imageToBase64Head(String imgFile){  
  14.          //将图片文件转化为字节数组字符串,并对其进行Base64编码处理  
  15.          String type = imgFile.substring(imgFile.length()-3,imgFile.length());  
  16.          //为编码添加头文件字符串  
  17.          String head = "data:image/"+type+";base64,";  
  18.           
  19.          return head + imageToBase64(imgFile);  
  20.      }  
  21.      /** 
  22.       * 将图片转换成Base64编码 
  23.       * @param imgFile 待处理图片 
  24.       * @return 
  25.       */  
  26.      public static String imageToBase64(String imgFile){  
  27.          //将图片文件转化为字节数组字符串,并对其进行Base64编码处理  
  28.            
  29.          //拿到上传图片后,图片所在的项目中真实路径  
  30.          String path = ServletActionContext.getServletContext().getRealPath(imgFile.substring(5, imgFile.length()));  
  31.       
  32.         InputStream in = null;  
  33.          byte[] data = null;  
  34.            
  35.          try   
  36.          {  
  37.             //读取图片字节数组  
  38.              in = new FileInputStream(path);          
  39.              data = new byte[in.available()];  
  40.              in.read(data);  
  41.              in.close();  
  42.          }   
  43.          catch (IOException e)   
  44.          {  
  45.              e.printStackTrace();  
  46.          }  
  47.            
  48.          return new String(Base64.encodeBase64(data));  
  49.      }  
  50.        
  51.        
  52. }  

 

存入到CLOB字段后,就是这样了



  



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Bitmap OutOfMemory 解决办法

Android Bitmap OutOfMemory 解决办法 置顶 2014年07月01日 14:41:22 阅读数:3072 标签: OutOfMemoryBitmapandroid图片优化更多 个人分类: 异常问题和解决办法 在Android应用里,最耗费内存的就是图片资源。而且在Android系统中…

为什么光标停在表格中间_word里面为什么打出来的数字中间为啥差一个光标的距离 - 卡饭网...

为Word宏添加VBA项目的数字证书签名为Word宏添加VBA项目的数字证书签名 用户在使用Word编辑文档时可以借助Word宏命令提高工作效率。在默认情况下,Word宏的安全性设置为“高”,当运行Word宏命令时会自动禁用宏。如果将Word宏安全性设置为“中”&#xff…

Java8学习笔记(1) -- 从函数式接口说起

转载自 Java8学习笔记(1) -- 从函数式接口说起希望本文能够成为Java8 Lambda表达式的快速入门指南。 函数式接口 理解Functional Interface(函数式接口,以下简称FI)是学习Java8 Lambda表达式的关键所在,所…

.Net Aop(静态织入)框架 BSF.Aop

BSF.Aop .Net 免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收费);实现前后Aop切面和INotifyPropertyChanged注入方式。 开源地址: https://git.oschina.net/chejiangyi/BSF.Aop 开源QQ群: .net 开源基…

C#7.0中有哪些新特性?

以下将是 C# 7.0 中所有计划的语言特性的描述。随着 Visual Studio “15” Preview 4 版本的发布,这些特性中的大部分将活跃起来。现在是时候来展示这些特性,你也告诉借此告诉我们你的想法! C#7.0 增加了许多新功能,并…

java8的函数指针

转载自 java8的函数指针这段时间 项目实在是太紧了,没有时间写博客啊。java模式的文章还没有写完,后期在写吧。 最近项目中大量的使用到了远程调用以及回调。是采用反射的方式实现的。担心到大量的反射会影响到程序运行的效率问题。 所以决定放弃使用反…

新闻发布项目——接口类(newsTbDao)

package bdqn.newsMange.Dao;import java.util.List;import bdqn.newsMange.entity.newsTb;/*** 新闻的接口类* author Administrator**/ public interface newsTbDao {//查询public List<newsTb>getnewsTbAll();//添加public int addNewsTb(newsTb news);//修改public i…

nbiot开发需要掌握什么_学习软件开发需要准备什么?

2020年&#xff0c;随着Internet的不断发展&#xff0c;现在Internet已经融入到每个人的生活中&#xff0c;所以在计算机行业的发展中&#xff0c;软件开发技术就显得非常重要&#xff0c;因为它是与我们的生活息息相关的&#xff0c;选择许多人想学习Java软件开发技术&#xf…

面试项目 java-服务端 18h58

以淘宝为例子介绍一下 这个架构非常之复杂&#xff0c;创业公司无法达到这样的架构&#xff0c;在当前阶段找到适合的架构 用户名唯一 横向越权 纵向越权 ftp服务器 mybatis mybatis反向工程 mybatis pageHelper 所有的东西在一个服务器上面 三台服务器单独做一个东…

Google高性能RPC框架gRPC 1.0.0发布

鉴于gRPC已进入稳定版分支&#xff0c;并对应用于生产中准备就绪&#xff0c;Google发布了gRPC 1.0。 gRPC源于被称为Stubby的Google内部项目&#xff0c;早期是用于一些Google内部服务间的通信。18个月前Google开源了gRPC框架&#xff0c;希望借此gRPC能被更广泛地采纳&#x…

java打开文件(Windows exe,应用文件exe,以及其他任何格式的文件)

转载自 java打开文件&#xff08;Windows exe,应用文件exe,以及其他任何格式的文件&#xff09; 使用java代码打开任何格式的文件 public static void main(String[] args) throws IOException { openWindowsExe(); openExe(); openFile(); } //用 Java 调用win…

新闻发布项目——接口类(commentDao)

package bdqn.newsMange.Dao;import java.util.List;import bdqn.newsMange.entity.comment;/*** 新闻评论的接口* author Administrator**/ public interface commentDao {//查询public List<comment>getCommentAll();//根据id查询新闻信息public List<comment> g…

delphi7存取配置文件与sqlserver数据库连接_SQL Server基础知识概念要点详细讲解

SQL Server基础知识概念要点详细讲解目录基础概念1、网状模型数据库2、层次模型数据库3、关系模型数据库知识点实例总结基础概念SQL语言中&#xff0c;between and表示包括两边参数。%取余&#xff0c;/取商模式&#xff1a;在数据库三级模式结构中&#xff0c;对数据库中全部的…

.Net Core 中的包、元包与框架(Packages, Metapackages and Frameworks)

包&#xff0c;元包与框架 本文翻译自 Packages, Metapackages and Frameworks。 .Net Core 是一种由 NuGet 包组成的平台。一些产品体验受益于代码包的细粒度定义&#xff0c;而另一些受益于粗粒度的定义&#xff0c;这两种定义都是有用的&#xff0c;不能绝对地说哪个好与不好…

面试项目 java-服务端2 18h58

idea2017对mybatis plugin支持不是很好 标准的meaven项目用谁都一样 archetype是官网提供的模板项目 .gitignore文件非常的重要配置 Meven的pom文件 项目的包结构 Mybatis三剑客

Java剪切板操作大全

转载自 Java剪切板操作大全1. 概述提起剪切板&#xff0c;一般都是在桌面系统或工具中使用。目前&#xff0c;操作Java剪切板有两种形式&#xff0c;这也对应着两种不同的技术Swing和JavaFX。而剪切板有可以分为系统剪切板和自定义剪切板。顾名思义&#xff0c;系统剪切板可以…

君威u0073故障码解决_顽疾修复过程,君威没倒挡的变速箱故障就是这样修好

君威没倒挡的变速箱故障表现&#xff1a;开了18万公里的君威有没有倒挡的故障发生。每当这时&#xff0c;要重新启动能恢复。但是&#xff0c;出现的没倒挡的次数逐渐增多。没检查出故障码。顽疾修复过程&#xff0c;君威没倒挡的变速箱故障就是这样修好&#xff1a;检查君威变…

idea创建标准的meaven项目

若没有jdk 则这样配置 就是下拉框默认没有jdk1.7 初始化完成了

新闻发布项目——接口类(categoryTBDao)

package bdqn.newsMange.Dao;import java.util.List;import bdqn.newsMange.entity.categoryTB;/*** 新闻类别的接口* author Administrator**/ public interface categoryTBDao {//查询所有的类别public List<categoryTB> getCategoryTBAll();//添加新闻类别public int …

controller属于哪一层_别急着换5G,4G手机同样值得考虑!哪几款安卓手机称得上4G机皇?...

今年已经进入了5G手机大战&#xff0c;目前有不少厂商都推出了自家的5G旗舰。虽说5G是以后的主流&#xff0c;但目前入手5G手机还为时尚早&#xff0c;毕竟距离5G全面普及还有至少2年时间&#xff0c;5G的套餐费用也高出许多。当前一些4G旗舰机型价格下降幅度不小&#xff0c;马…