Java處理富文本編輯器的圖片轉爲base64編碼

一、需求(場景)

 後臺(內網)通過富文本編輯器編輯的圖文信息,需要在移動端(外網)展示,需要將內容中的圖片的src的路徑替換成base64編碼的傳遞到前臺。

二、思路

 1.獲取內容中的<img>標籤的src的url,請求url,將請求到的圖片進行base64編碼。

三、工具類

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import sun.misc.BASE64Encoder;

/**
 * 
 * @ClassName:HtmlUtil
 * @Description:處理富文本編輯器保存內容
 * @author: Ming
 * @createdate:2019-4-25 下午7:25:40
 * @version V1.0
 * @Copyright: 2019 www.***.com Inc. All rights reserved.
 * 
 */
public class HtmlUtil {

	/**
	 * 
	 * @Title: imgInHtmlToBase
	 * @Description:將html中img標籤的src的url對應的圖片替換成base64的圖片
	 * @param strHtml
	 * @return
	 * 
	 */
	public static String imgInHtmlToBase(String strHtml) {
		StringBuffer sb = new StringBuffer();
		// 目前img標籤標示有3種表達式
		// <img alt="" src="1.jpg"/> <img alt="" src="1.jpg"></img> <img alt=""
		// src="1.jpg">
		// 開始匹配content中的<img />標籤
		Pattern p_img = Pattern.compile("<(img|IMG)(.*?)(/>|></img>|>)");
		Matcher m_img = p_img.matcher(strHtml);
		boolean result_img = m_img.find();
		if (result_img) {
			while (result_img) {
				StringBuffer sbSrc = new StringBuffer();
				// 獲取到匹配的<img />標籤中的內容
				String str_img = m_img.group(2);
				// 開始匹配<img />標籤中的src
				Pattern p_src = Pattern
						.compile("(src|SRC)=(\"|\')(.*?)(\"|\')");
				Matcher m_src = p_src.matcher(str_img);
				if (m_src.find()) {
					// 取出img的src的url路徑
					String str_src = m_src.group(3);
					// 將圖片轉成base64碼
					String base = imgToBase64(str_src);
					m_src.appendReplacement(sbSrc, " src=\"" + str_src + "\" ");
					m_img.appendReplacement(sb,
							"<img class=\"img-responsive\" src=\"data:image/png;base64,"
									+ base + "\" />");
				}
				// 結束匹配<img />標籤中的src
				// 匹配strHtml中是否存在下一個<img />標籤,有則繼續以上步驟匹配<img />標籤中的src
				result_img = m_img.find();
			}
			m_img.appendTail(sb);
			return sb.toString();
		} else {
			return strHtml;
		}

	}

	/**
	 * 
	 * @Title: imgToBase64
	 * @Description:根據圖片的路徑轉成base64碼
	 * @param imgURL
	 * @return
	 * 
	 */
	public static String imgToBase64(String imgURL) {
		boolean flag = false;
		ByteArrayOutputStream outPut = new ByteArrayOutputStream();
		byte[] data = new byte[1024];
		try {
			// 創建URL
			URL url = new URL(imgURL);
			// 創建鏈接
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");
			conn.setConnectTimeout(10 * 1000);

			if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
				flag = false;// 連接失敗/鏈接失效/圖片不存在
			}
			InputStream inStream = conn.getInputStream();
			int len = -1;
			while ((len = inStream.read(data)) != -1) {
				outPut.write(data, 0, len);
			}
			inStream.close();
			flag = true;
		} catch (IOException e) {
			flag = false;
		}
		// 異常情況下 返回一個圖片丟失的base64的圖片
		String failImg = "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";
		// 對字節數組Base64編碼
		if (flag == true) {
			BASE64Encoder encoder = new BASE64Encoder();
			return encoder.encode(outPut.toByteArray());
		} else {
			return failImg;
		}
	}
}

 四、使用

 

public class TestHtmlUtil {
	public static void main(String[] args) {
		// 模擬富文本編輯器中內容
		String strHtml = "<p>測試</p><img src=\"https://avatar.csdn.net/9/9/B/3_asuyunlong.jpg\" class=\"avatar_pic\">"
				+ "<span class=\"read-count\">閱讀數:2448</span>"
				+ "<img data-v-0d738edb=\"\" src=\"https://profile.csdnimg.cn/7/2/7/1_qq_24484085\" alt=\"\" class=\"head\">";

		String result = HtmlUtil.imgInHtmlToBase(strHtml);
		System.out.println(result);

	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章