转载自  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. return SUCCESS;
  7. }

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

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

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

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

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

  1. Java解析word文档,将word文档题库选择题导入

    学习目标: Java解析word文档,将word文档题库导入 学会word文档的解析,以及各种题型的导入 学习内容: 解析word文档 获取正文文件内容 doc和docx两种解析 解析word文档 p ...

  2. java将图片转成Base64编码,并压缩至40k

    1.添加jar包 <!-- 压缩图片--> <dependency><groupId>net.coobird</groupId><artifact ...

  3. base64转html文件,图片转换成Base64编码集成到html文件

    首先为什么要这么做?  原因很简单这样可以减少与服务器的请求,当然对于一些浏览器并不支持,如IE8.通常用在手机版网站中,具体转化方法如下: 1.在线打开Base64的编码器将图片编码成Base64 ...

  4. php将上传的图片转为base64,html5实现把上传的图片转成base64编码在显示(代码实例)...

    本章给大家介绍html5实现把上传的图片转成base64编码在显示(代码实例).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 首先我们来详细的看一看base64编码: 什么是bas ...

  5. 使用aspose.word.for.java解析word文档图片并替换

    /** *需要import的包有如下 *import com.aspose.words.Document; *import com.aspose.words.DocumentBuilder; *imp ...

  6. xml教程之java解析xml文档

    1.java解析xml文件介绍 XML解析方式分为两种:DOM方式和SAX方式 DOM:Document Object Model,文档对象模型.这种方式是W3C推荐的处理XML的一种方式. SAX: ...

  7. python下载图片到文件夹_python实现解析markdown文档中的图片,并且保存到本地~

    背景 前阵子简书好像说是凉了,搞得我有点小慌,毕竟我的大部分博客都是放在简书上面的,虽然简书提供了打包导出功能,但是只能导出文字,图片的话还是存在简书服务器上面,再加上我一直想要重新做一个个人博客,于 ...

  8. java解析各种文档格式_java读取各类型的文件

    用到的几个包 bcmail-jdk14-132.jar/bcprov-jdk14-132.jar/checkstyle-all-4.2.jar/FontBox-0.1.0-dev.jar/lucene ...

  9. java处理word文档 替换文本 水印 页眉

    分享一个实用工具包Spire.Doc Spire.Doc简介 导入jar包 代码示例 最近项目需要操作word文档,需求是批量替换word文档内容. 网络上各种搜索推荐POI什么的,因为以前用过POI ...

最新文章

  1. Android监听左右滑删除通知,Android 滑动监听RecyclerView线性流+左右划删除+上下移动...
  2. 负数分解质因数java_Java经典案例之-“分解质因数”
  3. linux系统中tar命令的使用,linux 系统的tar命令使用方法详解
  4. python数据挖掘例题_数据挖掘与python实践试题及答案
  5. js循环判断有无重复值_JavaScript中的while循环
  6. 聊聊flink的Async I/O
  7. android x86 sleep,如何打开Android X86对houdini的支持
  8. php 瓶颈,追踪php代码性能瓶颈
  9. linux锁定系统时间设置,Linux时间设置系统时间、硬件时间和时间服务
  10. linux监控进程资源,linux系统资源监控命令
  11. yum 安装rabbitMQ
  12. python计算器外壳模板
  13. 笨方法学习python--46--python项目骨架
  14. Java 中文按拼音进行排序
  15. python字体有哪些种类_Python的数据类型(字符串类型),python
  16. Java中的类、方法、属性的命名规则
  17. 仿微同商城后台API
  18. CTF解题记录-Misc-当铺秘密
  19. a5 1c语言实现,A5算法的C语言实现
  20. Android 仿微信聊天气泡

热门文章

  1. [蓝桥杯2018初赛]全球变暖-dfs,bfs,连通块
  2. 蓝桥杯2016初赛-网友年龄-枚举
  3. 对象的多数组表示(不一样的链表-多数组表示链表)
  4. MarkDown的介绍
  5. MarkDown语法, 快捷键,Dos命令
  6. java 导入导出 插件_Java最优的Excel导入/导出工具开发,你用过吗?
  7. POJ3320 Jessica's Reading Problem 尺取法
  8. Codeforces Round #631 (Div. 2) C. Dreamoon Likes Coloring 构造
  9. CodeCraft-20 (Div. 2) D. Nash Matrix 构造 + dfs
  10. Codeforces Round #610 (Div. 2) D. Enchanted Artifact 交互 + 思维