日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時(shí)間:2023/12/3 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自??JAVA解析html文檔,替換img圖片路徑成base64編碼,并將文章存入數(shù)據(jù)庫

開發(fā)環(huán)境:struts2+ spring + hibernate

數(shù)據(jù)庫:oracle

需求:在HTML編輯器中輸入文章,傳入后臺(tái),文章中所有圖片路徑,轉(zhuǎn)換成base64編碼,將文章存入數(shù)據(jù)庫中的CLOB字段。

知識(shí)點(diǎn):HTML編輯器,html解析,base64編碼,String到CLOB類型轉(zhuǎn)換

?

? ? ? ? 一般情況下,數(shù)據(jù)庫只需要保存圖片的路徑就可以了,圖片文件放在項(xiàng)目文件夾中,顯示時(shí)只需加載圖片路徑即可。但是時(shí)下信息共享的渠道太多了 ,當(dāng)IOS,android,微信公眾號(hào)都操作同一個(gè)數(shù)據(jù)庫的時(shí)候,上述方案是無法加載到圖片的。因此我想到一個(gè)辦法就是上傳圖片后,將路徑替換為base64編碼,存入數(shù)據(jù)庫即可。

? ? ? ?我使用的編輯器是kindeditor,演示內(nèi)容:

?



?備注:kindeditor上傳圖片的功能會(huì)和struts2會(huì)有沖突,因?yàn)閟truts2過濾jsp時(shí)會(huì)改變r(jià)equest類型,解決方法鏈接http://blog.csdn.net/kunkun378263/article/details/23274369

?

文章內(nèi)容傳到后臺(tái)后,調(diào)用HTML解析類的編碼方法 ,并用hibernate的createClob方法將String 轉(zhuǎn)成CLOB,添加到數(shù)據(jù)庫。

Action方法:

  • public?String?add(){??
  • ????????String?content?=?request.getParameter("content");??
  • ????????Clob?clob?=Hibernate.createClob(HtmlJsoup.html_ImgToBase64(content));??
  • ????????article.setContent(clob);??
  • ????????service.add(article);??
  • ??
  • ????????????????return?SUCCESS;??
  • ????}??
  • ?

    我使用的HTML解析器是jsoup,類名和方法名都是和javaScript相類似的,對(duì)于會(huì)jquery的同學(xué)簡直是福音,非常好理解非常好用,下面是我自己寫的HTML解析類的代碼,在轉(zhuǎn)碼前還會(huì)調(diào)用一個(gè)使用了正則表達(dá)式的方法用于檢測路徑是否為有效路徑。

  • import?java.io.File;??
  • import?java.util.regex.Matcher;??
  • import?java.util.regex.Pattern;??
  • import?org.apache.struts2.ServletActionContext;??
  • import?org.jsoup.Jsoup;??
  • import?org.jsoup.nodes.*;??
  • import?org.jsoup.select.Elements;??
  • ??
  • public?class?HtmlJsoup?{??
  • ??
  • ????/**?
  • ?????*?檢測圖片路徑是否為真實(shí)有效的路徑方法?
  • ?????*?@param?src?
  • ?????*?@return?
  • ?????*/??
  • ????public?static?boolean?checkImage(String?src){??
  • ??
  • ??????????
  • ????????//使用正則表達(dá)式,排除img標(biāo)簽src屬性值已經(jīng)是base64編碼的情況??
  • ????????Pattern?pattern?=?Pattern.compile("^data:image/(png|gif|jpg|jpeg|bmp|tif|psd|ICO);base64,.*");??
  • ????????Matcher?matcher?=?pattern.matcher(src);??
  • ????????if(matcher.matches())??
  • ????????????return?false;??
  • ????????//排除src路徑并非圖片格式的情況??
  • ????????pattern=Pattern.compile("^.*[.](png|gif|jpg|jpeg|bmp|tif|psd|ICO)$");??
  • ????????matcher?=?pattern.matcher(src);??
  • ????????if(!matcher.matches())??
  • ????????????return?false;??
  • ????????//排除圖片路徑不存在的情況??
  • ????????String?path?=?ServletActionContext.getServletContext().getRealPath(src.substring(5,?src.length()));??
  • ????????File?file?=?new?File(path);??
  • ????????if(!file.exists())??
  • ????????????return?false;??
  • ??????
  • ????????return?true;??
  • ????}??
  • ????public?static?String?html_ImgToBase64(String?html){??
  • ????????Document?doc?=?Jsoup.parse(html,?"utf-8");??
  • ????????Elements?imgs?=?doc.getElementsByTag("img");??
  • ??????????
  • ????????for(Element?img?:imgs){??
  • ????????????String?src?=?img.attr("src");??
  • ??????????????
  • ????????????if(!checkImage(src))??
  • ????????????????continue;??
  • ????????????//將有效的路徑傳入base64編碼的方法??
  • ????????????img.attr("src",ImageBase64.imageToBase64Head(src));??
  • ??????????????
  • ????????}??
  • ??????????
  • ????????//返回base64編碼后的html文檔??
  • ????????return?doc.getElementsByTag("body").html();??
  • ????}??
  • }??
  • ?

    最后是圖片轉(zhuǎn)base64的編碼類代碼,記得要帶上頭文件,不然顯示時(shí)無法識(shí)別。

  • import?java.io.*;??
  • import?org.apache.commons.codec.binary.Base64;??
  • import?org.apache.struts2.ServletActionContext;??
  • ??
  • ??
  • public?class?ImageBase64?{??
  • ???????
  • ?????/**?
  • ??????*?將圖片轉(zhuǎn)換成Base64編碼?,帶頭文件?
  • ??????*?@param?imgFile?待處理圖片?
  • ??????*?@return?
  • ??????*/??
  • ?????public?static?String?imageToBase64Head(String?imgFile){??
  • ?????????//將圖片文件轉(zhuǎn)化為字節(jié)數(shù)組字符串,并對(duì)其進(jìn)行Base64編碼處理??
  • ?????????String?type?=?imgFile.substring(imgFile.length()-3,imgFile.length());??
  • ?????????//為編碼添加頭文件字符串??
  • ?????????String?head?=?"data:image/"+type+";base64,";??
  • ??????????
  • ?????????return?head?+?imageToBase64(imgFile);??
  • ?????}??
  • ?????/**?
  • ??????*?將圖片轉(zhuǎn)換成Base64編碼?
  • ??????*?@param?imgFile?待處理圖片?
  • ??????*?@return?
  • ??????*/??
  • ?????public?static?String?imageToBase64(String?imgFile){??
  • ?????????//將圖片文件轉(zhuǎn)化為字節(jié)數(shù)組字符串,并對(duì)其進(jìn)行Base64編碼處理??
  • ???????????
  • ?????????//拿到上傳圖片后,圖片所在的項(xiàng)目中真實(shí)路徑??
  • ?????????String?path?=?ServletActionContext.getServletContext().getRealPath(imgFile.substring(5,?imgFile.length()));??
  • ??????
  • ????????InputStream?in?=?null;??
  • ?????????byte[]?data?=?null;??
  • ???????????
  • ?????????try???
  • ?????????{??
  • ????????????//讀取圖片字節(jié)數(shù)組??
  • ?????????????in?=?new?FileInputStream(path);??????????
  • ?????????????data?=?new?byte[in.available()];??
  • ?????????????in.read(data);??
  • ?????????????in.close();??
  • ?????????}???
  • ?????????catch?(IOException?e)???
  • ?????????{??
  • ?????????????e.printStackTrace();??
  • ?????????}??
  • ???????????
  • ?????????return?new?String(Base64.encodeBase64(data));??
  • ?????}??
  • ???????
  • ???????
  • }??
  • ?

    存入到CLOB字段后,就是這樣了



    ??



    總結(jié)

    以上是生活随笔為你收集整理的JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。