轉載自??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方法:
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相類似的,對于會jquery的同學簡直是福音,非常好理解非常好用,下面是我自己寫的HTML解析類的代碼,在轉碼前還會調用一個使用了正則表達式的方法用于檢測路徑是否為有效路徑。
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?{??????????????????public?static?boolean?checkImage(String?src){????????????????????????????????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;????????????????????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;????????????????????????????img.attr("src",ImageBase64.imageToBase64Head(src));????????????????????????}??????????????????????????????return?doc.getElementsByTag("body").html();??????}??}??
?
最后是圖片轉base64的編碼類代碼,記得要帶上頭文件,不然顯示時無法識別。
import?java.io.*;??import?org.apache.commons.codec.binary.Base64;??import?org.apache.struts2.ServletActionContext;??????public?class?ImageBase64?{?????????????????????????public?static?String?imageToBase64Head(String?imgFile){??????????????????????String?type?=?imgFile.substring(imgFile.length()-3,imgFile.length());??????????????????????String?head?=?"data:image/"+type+";base64,";?????????????????????return?head?+?imageToBase64(imgFile);???????}??????????????????public?static?String?imageToBase64(String?imgFile){????????????????????????????????????????????String?path?=?ServletActionContext.getServletContext().getRealPath(imgFile.substring(5,?imgFile.length()));????????????????InputStream?in?=?null;???????????byte[]?data?=?null;??????????????????????try????????????{?????????????????????????????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字段后,就是這樣了
??
總結
以上是生活随笔為你收集整理的JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。