文本图片保存数据库"/>
java处理富文本图片保存数据库
在接收富文本时,数据库接收含有图片内容,图片会自动转换为Base64编码保存到数据库,导数据库性能降低。
解决:在接收富文本内容时,将接收到的图片转换为文件上传到Minio(Minio具体使用可参考文档),然后将base64编码替换为图片地址保存
用到的工具类
使用正则表达式提取接收内容的Base64编码工具类
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class ImgBaseUtil {public static List<String> getImgStr(String htmlStr) {List<String> list = new ArrayList<>();String img = "";Pattern p_image;Matcher m_image;// String regEx_img = "<img.*src=(.*?)[^>]*?>"; //图片链接地址String regEx_img = "<img.*src\\s*=\\s*(.*?)[^>]*?>";p_image = Patternpile(regEx_img, Pattern.CASE_INSENSITIVE);m_image = p_image.matcher(htmlStr);while (m_image.find()) {// 得到<img />数据img = m_image.group();// 匹配<img>中的src数据Matcher m = Patternpile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)").matcher(img);while (m.find()) {list.add(m.group(1));}}return list;}
}
将Base64编码转换为文件流的工具类
import org.springframework.web.multipart.MultipartFile;
import sun.misc.BASE64Decoder;import java.io.*;public class BASE64DecodedMultipartFile implements MultipartFile {private final byte[] imgContent;private final String header;public BASE64DecodedMultipartFile(byte[] imgContent, String header) {this.imgContent = imgContent;this.header = header.split(";")[0];}@Overridepublic String getName() {return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1];}@Overridepublic String getOriginalFilename() {return System.currentTimeMillis() + (int) Math.random() * 10000 + "." + header.split("/")[1];}@Overridepublic String getContentType() {return header.split(":")[1];}@Overridepublic boolean isEmpty() {return imgContent == null || imgContent.length == 0;}@Overridepublic long getSize() {return imgContent.length;}@Overridepublic byte[] getBytes() throws IOException {return imgContent;}@Overridepublic InputStream getInputStream() throws IOException {return new ByteArrayInputStream(imgContent);}@Overridepublic void transferTo(File dest) throws IOException, IllegalStateException {new FileOutputStream(dest).write(imgContent);}public static MultipartFile base64ToMultipart(String base64) {try {String[] baseStrs = base64.split(",");BASE64Decoder decoder = new BASE64Decoder();byte[] b = new byte[0];b = decoder.decodeBuffer(baseStrs[1]);for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {b[i] += 256;}}return new BASE64DecodedMultipartFile(b, baseStrs[0]);} catch (IOException e) {e.printStackTrace();return null;}}}
内容接收并完成处理工具类
public class RichTextUtil {/**** @param text 富文本内容* @return 返回处理图片后的数据*/public String richText(String text,MinioUtils minioUtils,MinioConfig minioConfig){String s=new String(text);String result=null;//返回结果List<String> imgStr = ImgBaseUtil.getImgStr(s); //每组base64编码图片if (imgStr.isEmpty()){return text;}for (String s1:imgStr){ //每个base64转换并上传String s2= UUID.randomUUID().toString().replaceAll("-","")+".jpg"; //新的文件链接//上传MultipartFile multipartFile = BASE64DecodedMultipartFile.base64ToMultipart(s1);assert multipartFile != null;minioUtils.putObject1(multipartFile,minioConfig.getBucketName(),s2);String foreverUrl=minioConfig.getEndpoint()+":"+minioConfig.getPort()+"/"+minioConfig.getBucketName()+"/"+s2;//永久链接if (Objects.isNull(result)){result=s.replace(s1,foreverUrl); //第一次替换}result=result.replace(s1,foreverUrl); //前边替换过,继续替换}return result;}
}
配合Minio工具类使用
@GetMapping("/tss")public String dmo(@RequestBody Entity entity) throws IOException {String s=entity.getContent();//接收到的内容RichTextUtil richTextUtil = new RichTextUtil();String s1 = richTextUtil.richText(s,minioUtils,minioConfig);entity.setContent(s1);//最后将转换过的内容替换就行//数据库保存一下实体类内容return entity;}
Minio使用可查询相关资料或了解本博客SpringBoot对Minio的简单使用链接:
更多推荐
java处理富文本图片保存数据库
发布评论