From 2f0ae51b443f8b15d55b3f2bc9750618305403ea Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Wed, 21 Feb 2024 13:46:04 +0800
Subject: [PATCH] 图片上传保存图片base64数据到表
---
src/main/java/org/springblade/common/utils/Base64Util.java | 83 ++++++++
src/main/java/org/springblade/modules/resource/service/impl/AttachDataServiceImpl.java | 24 ++
src/main/java/org/springblade/modules/resource/vo/AttachDataVO.java | 17 +
src/main/java/org/springblade/modules/resource/entity/AttachData.java | 84 ++++++++
src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java | 32 +++
src/main/java/org/springblade/common/utils/ImageUtils.java | 245 ++++++++++++++++++++++++
src/main/java/org/springblade/modules/resource/mapper/AttachDataMapper.xml | 22 ++
src/main/java/org/springblade/modules/resource/service/IAttachDataService.java | 25 ++
src/main/java/org/springblade/modules/resource/mapper/AttachDataMapper.java | 25 ++
9 files changed, 557 insertions(+), 0 deletions(-)
diff --git a/src/main/java/org/springblade/common/utils/Base64Util.java b/src/main/java/org/springblade/common/utils/Base64Util.java
new file mode 100644
index 0000000..15e44ac
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/Base64Util.java
@@ -0,0 +1,83 @@
+package org.springblade.common.utils;
+
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+import javax.imageio.stream.FileImageInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class Base64Util {
+ /**
+ * 字符串转图片
+ * @param base64Str
+ * @return
+ */
+ public static byte[] decode(String base64Str){
+ byte[] b = null;
+ BASE64Decoder decoder = new BASE64Decoder();
+ try {
+ b = decoder.decodeBuffer(replaceEnter(base64Str));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return b;
+ }
+
+ /**
+ * 图片转字符串
+ * @param image
+ * @return
+ */
+ public static String encode(byte[] image){
+ BASE64Encoder decoder = new BASE64Encoder();
+ return replaceEnter(decoder.encode(image));
+ }
+
+ public static String encode(String uri){
+ BASE64Encoder encoder = new BASE64Encoder();
+ return replaceEnter(encoder.encode(uri.getBytes()));
+ }
+
+ /**
+ *
+ * @path 图片路径
+ * @return
+ */
+
+ public static byte[] imageTobyte(String path){
+ byte[] data = null;
+ FileImageInputStream input = null;
+ try {
+ input = new FileImageInputStream(new File(path));
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ byte[] buf = new byte[1024];
+ int numBytesRead = 0;
+ while((numBytesRead = input.read(buf)) != -1){
+ output.write(buf, 0, numBytesRead);
+ }
+ data = output.toByteArray();
+ output.close();
+ input.close();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return data;
+ }
+
+
+
+ public static String replaceEnter(String str){
+ String reg ="[\n-\r]";
+ Pattern p = Pattern.compile(reg);
+ Matcher m = p.matcher(str);
+ return m.replaceAll("");
+ }
+
+
+}
diff --git a/src/main/java/org/springblade/common/utils/ImageUtils.java b/src/main/java/org/springblade/common/utils/ImageUtils.java
new file mode 100644
index 0000000..dafb8fd
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/ImageUtils.java
@@ -0,0 +1,245 @@
+package org.springblade.common.utils;
+
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.imageio.ImageIO;
+import javax.swing.*;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+
+public class ImageUtils {
+
+
+
+ public static String getBase64ByImgUrl(String url){
+ String suffix = url.substring(url.lastIndexOf(".") + 1);
+ try {
+ URL urls = new URL(url);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ Image image = Toolkit.getDefaultToolkit().getImage(urls);
+ BufferedImage biOut = toBufferedImage(image);
+ ImageIO.write(biOut, suffix, baos);
+ String base64Str = Base64Util.encode(baos.toByteArray());
+ return base64Str;
+ } catch (Exception e) {
+ return "";
+ }
+
+ }
+
+ public static BufferedImage toBufferedImage(Image image) {
+ if (image instanceof BufferedImage) {
+ return (BufferedImage) image;
+ }
+ // This code ensures that all the pixels in the image are loaded
+ image = new ImageIcon(image).getImage();
+ BufferedImage bimage = null;
+ GraphicsEnvironment ge = GraphicsEnvironment
+ .getLocalGraphicsEnvironment();
+ try {
+ int transparency = Transparency.OPAQUE;
+ GraphicsDevice gs = ge.getDefaultScreenDevice();
+ GraphicsConfiguration gc = gs.getDefaultConfiguration();
+ bimage = gc.createCompatibleImage(image.getWidth(null),
+ image.getHeight(null), transparency);
+ } catch (HeadlessException e) {
+ // The system does not have a screen
+ }
+ if (bimage == null) {
+ // Create a buffered image using the default color model
+ int type = BufferedImage.TYPE_INT_RGB;
+ bimage = new BufferedImage(image.getWidth(null),
+ image.getHeight(null), type);
+ }
+ // Copy image to buffered image
+ Graphics g = bimage.createGraphics();
+ // Paint the image onto the buffered image
+ g.drawImage(image, 0, 0, null);
+ g.dispose();
+ return bimage;
+ }
+
+ /**
+ * 得到文件流
+ * @param url 图片地址
+ * @return
+ */
+ public static byte[] getFileStream(String url){
+ try {
+ URL httpUrl = new URL(url);
+ HttpURLConnection conn = (HttpURLConnection)httpUrl.openConnection();
+ conn.setRequestMethod("GET");
+ conn.setConnectTimeout(5 * 1000);
+ //通过输入流获取图片数据
+ InputStream inStream = conn.getInputStream();
+ //得到图片的二进制数据
+ byte[] btImg = readInputStream(inStream);
+ return btImg;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * 从输入流中获取数据
+ * @param inStream 输入流
+ * @return
+ * @throws Exception
+ */
+ public static byte[] readInputStream(InputStream inStream) throws Exception{
+ ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+ byte[] buffer = new byte[1024];
+ int len = 0;
+ while( (len=inStream.read(buffer)) != -1 ){
+ outStream.write(buffer, 0, len);
+ }
+ inStream.close();
+ return outStream.toByteArray();
+ }
+
+ /**
+ * MultipartFile 转 base64 字符串
+ * @param file
+ * @return
+ */
+ public static String mulToBase64(MultipartFile file) {
+ String base64EncoderImg = "";
+ byte[] buffer = null;
+ try {
+ InputStream inputStream = file.getInputStream();
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ byte[] b = new byte[1024];
+ int n;
+ while ((n = inputStream.read(b)) != -1)
+ {
+ bos.write(b, 0, n);
+ }
+ inputStream.close();
+ bos.close();
+ buffer = bos.toByteArray();
+ base64EncoderImg = "data:image/png;base64," +Base64.encodeBase64String(buffer);
+ // 返回
+ return base64EncoderImg;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ // 返回
+ return base64EncoderImg;
+ }
+
+
+ /**
+ * 通过图片的url获取图片的base64字符串
+ * @param imgUrl 图片url
+ * @return 返回图片base64的字符串
+ */
+ public static String imageUrlToBase64(String imgUrl) {
+
+ URL url = null;
+
+ InputStream is = null;
+
+ ByteArrayOutputStream outStream = null;
+
+ HttpURLConnection httpUrl = null;
+
+ try{
+
+ url = new URL(imgUrl);
+
+ httpUrl = (HttpURLConnection) url.openConnection();
+
+ httpUrl.connect();
+
+ httpUrl.getInputStream();
+
+ is = httpUrl.getInputStream();
+
+
+
+ outStream = new ByteArrayOutputStream();
+
+ //创建一个Buffer字符串
+
+ byte[] buffer = new byte[1024];
+
+ //每次读取的字符串长度,如果为-1,代表全部读取完毕
+
+ int len = 0;
+
+ //使用一个输入流从buffer里把数据读取出来
+
+ while( (len=is.read(buffer)) != -1 ){
+
+ //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
+
+ outStream.write(buffer, 0, len);
+
+ }
+
+ // 对字节数组Base64编码
+
+ return Base64Util.encode(outStream.toByteArray());
+
+ }catch (Exception e) {
+
+ e.printStackTrace();
+
+ }
+
+ finally{
+
+ if(is != null)
+
+ {
+
+ try {
+
+ is.close();
+
+ } catch (IOException e) {
+
+ e.printStackTrace();
+
+ }
+
+ }
+
+ if(outStream != null)
+
+ {
+
+ try {
+
+ outStream.close();
+
+ } catch (IOException e) {
+
+ e.printStackTrace();
+
+ }
+
+ }
+
+ if(httpUrl != null)
+
+ {
+
+ httpUrl.disconnect();
+
+ }
+
+ }
+
+ return imgUrl;
+
+ }
+}
diff --git a/src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java b/src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java
index 4f1b37e..413f2f0 100644
--- a/src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java
+++ b/src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java
@@ -19,6 +19,7 @@
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
+import org.springblade.common.utils.ImageUtils;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.core.oss.model.OssFile;
@@ -28,8 +29,11 @@
import org.springblade.core.tool.constant.RoleConstant;
import org.springblade.core.tool.utils.FileUtil;
import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ImageUtil;
import org.springblade.modules.resource.builder.oss.OssBuilder;
import org.springblade.modules.resource.entity.Attach;
+import org.springblade.modules.resource.entity.AttachData;
+import org.springblade.modules.resource.service.IAttachDataService;
import org.springblade.modules.resource.service.IAttachService;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -55,6 +59,11 @@
* 附件表服务
*/
private final IAttachService attachService;
+
+ /**
+ * 附件数据表服务
+ */
+ private final IAttachDataService attachDataService;
/**
* 创建存储桶
@@ -242,6 +251,7 @@
String fileName = file.getOriginalFilename();
BladeFile bladeFile = ossBuilder.templateByPrefixPath(prefixPath).putFile(file.getOriginalFilename(), file.getInputStream());
Long attachId = buildAttach(fileName, file.getSize(), bladeFile);
+ buildAttachData(attachId,fileName, file.getSize(), bladeFile,file);
bladeFile.setAttachId(attachId);
// 修改link
changeLink(bladeFile);
@@ -270,6 +280,28 @@
}
/**
+ * 构建附件数据表
+ *
+ * @param attachId 附件id
+ * @param fileName 文件名
+ * @param fileSize 文件大小
+ * @param bladeFile 对象存储文件
+ * @return attachId
+ */
+ private Long buildAttachData(Long attachId,String fileName, Long fileSize, BladeFile bladeFile,MultipartFile file) {
+ String fileExtension = FileUtil.getFileExtension(fileName);
+ AttachData attach = new AttachData();
+ attach.setAttachId(attachId);
+ attach.setName(bladeFile.getName());
+ attach.setOriginalName(bladeFile.getOriginalName());
+ attach.setSize(fileSize);
+ attach.setExtension(fileExtension);
+ attach.setData(ImageUtils.mulToBase64(file));
+ attachDataService.save(attach);
+ return attach.getId();
+ }
+
+ /**
* 删除文件
*
* @param fileName 存储桶对象名称
diff --git a/src/main/java/org/springblade/modules/resource/entity/AttachData.java b/src/main/java/org/springblade/modules/resource/entity/AttachData.java
new file mode 100644
index 0000000..6312fcb
--- /dev/null
+++ b/src/main/java/org/springblade/modules/resource/entity/AttachData.java
@@ -0,0 +1,84 @@
+package org.springblade.modules.resource.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 附件数据表实体类
+ *
+ * @author zhongrj
+ */
+@Data
+@TableName("blade_attach_data")
+@ApiModel(value = "Attach对象", description = "附件表")
+public class AttachData implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @ApiModelProperty(value = "主键id")
+ @TableId(value = "id",type = IdType.ASSIGN_ID)
+ private Long id;
+
+ /**
+ * 附件id
+ */
+ @ApiModelProperty(value = "附件id")
+ private Long attachId;
+ /**
+ * 附件名称
+ */
+ @ApiModelProperty(value = "附件名称")
+ private String name;
+ /**
+ * 附件原名
+ */
+ @ApiModelProperty(value = "附件原名")
+ private String originalName;
+ /**
+ * 附件拓展名
+ */
+ @ApiModelProperty(value = "附件拓展名")
+ private String extension;
+ /**
+ * 附件大小
+ */
+ @ApiModelProperty(value = "附件大小")
+ private Long size;
+
+ /**
+ * 附件数据 base64
+ */
+ @ApiModelProperty(value = "附件数据 base64")
+ private String data;
+
+ /**
+ * 创建人
+ */
+ @JsonSerialize(using = ToStringSerializer.class)
+ @ApiModelProperty("创建人")
+ @TableField(fill = FieldFill.INSERT)
+ private Long createUser;
+
+ /**
+ * 创建时间
+ */
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty("创建时间")
+ @TableField(fill = FieldFill.INSERT)
+ private Date createTime;
+
+
+}
diff --git a/src/main/java/org/springblade/modules/resource/mapper/AttachDataMapper.java b/src/main/java/org/springblade/modules/resource/mapper/AttachDataMapper.java
new file mode 100644
index 0000000..6e6c6ec
--- /dev/null
+++ b/src/main/java/org/springblade/modules/resource/mapper/AttachDataMapper.java
@@ -0,0 +1,25 @@
+package org.springblade.modules.resource.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.resource.entity.AttachData;
+import org.springblade.modules.resource.vo.AttachDataVO;
+import java.util.List;
+
+/**
+ * 附件数据表 Mapper 接口
+ *
+ * @author zhongrj
+ */
+public interface AttachDataMapper extends BaseMapper<AttachData> {
+
+ /**
+ * 自定义分页
+ *
+ * @param page
+ * @param attachData
+ * @return
+ */
+ List<AttachDataVO> selectAttachDataPage(IPage page, AttachDataVO attachData);
+
+}
diff --git a/src/main/java/org/springblade/modules/resource/mapper/AttachDataMapper.xml b/src/main/java/org/springblade/modules/resource/mapper/AttachDataMapper.xml
new file mode 100644
index 0000000..fde1851
--- /dev/null
+++ b/src/main/java/org/springblade/modules/resource/mapper/AttachDataMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.resource.mapper.AttachDataMapper">
+
+ <!-- 通用查询映射结果 -->
+ <resultMap id="attachDataResultMap" type="org.springblade.modules.resource.entity.AttachData">
+ <result column="id" property="id"/>
+ <result column="create_user" property="createUser"/>
+ <result column="create_time" property="createTime"/>
+ <result column="name" property="name"/>
+ <result column="original_name" property="originalName"/>
+ <result column="extension" property="extension"/>
+ <result column="size" property="size"/>
+ <result column="data" property="data"/>
+ </resultMap>
+
+
+ <select id="selectAttachDataPage" resultMap="attachDataResultMap">
+ select * from blade_attach_data where 1=1
+ </select>
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/resource/service/IAttachDataService.java b/src/main/java/org/springblade/modules/resource/service/IAttachDataService.java
new file mode 100644
index 0000000..db8337e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/resource/service/IAttachDataService.java
@@ -0,0 +1,25 @@
+package org.springblade.modules.resource.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.resource.entity.AttachData;
+import org.springblade.modules.resource.vo.AttachDataVO;
+import org.springblade.modules.resource.vo.AttachVO;
+
+/**
+ * 附件数据表 服务类
+ *
+ * @author zhongrj
+ */
+public interface IAttachDataService extends IService<AttachData> {
+
+ /**
+ * 自定义分页
+ *
+ * @param page
+ * @param attachData
+ * @return
+ */
+ IPage<AttachDataVO> selectAttachDataPage(IPage<AttachDataVO> page, AttachDataVO attachData);
+
+}
diff --git a/src/main/java/org/springblade/modules/resource/service/impl/AttachDataServiceImpl.java b/src/main/java/org/springblade/modules/resource/service/impl/AttachDataServiceImpl.java
new file mode 100644
index 0000000..c94f954
--- /dev/null
+++ b/src/main/java/org/springblade/modules/resource/service/impl/AttachDataServiceImpl.java
@@ -0,0 +1,24 @@
+package org.springblade.modules.resource.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.resource.entity.AttachData;
+import org.springblade.modules.resource.mapper.AttachDataMapper;
+import org.springblade.modules.resource.service.IAttachDataService;
+import org.springblade.modules.resource.vo.AttachDataVO;
+import org.springframework.stereotype.Service;
+
+/**
+ * 附件数据表 服务实现类
+ *
+ * @author zhongrj
+ */
+@Service
+public class AttachDataServiceImpl extends ServiceImpl<AttachDataMapper, AttachData> implements IAttachDataService {
+
+ @Override
+ public IPage<AttachDataVO> selectAttachDataPage(IPage<AttachDataVO> page, AttachDataVO attachData) {
+ return page.setRecords(baseMapper.selectAttachDataPage(page, attachData));
+ }
+
+}
diff --git a/src/main/java/org/springblade/modules/resource/vo/AttachDataVO.java b/src/main/java/org/springblade/modules/resource/vo/AttachDataVO.java
new file mode 100644
index 0000000..b6937b0
--- /dev/null
+++ b/src/main/java/org/springblade/modules/resource/vo/AttachDataVO.java
@@ -0,0 +1,17 @@
+package org.springblade.modules.resource.vo;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import org.springblade.modules.resource.entity.AttachData;
+
+/**
+ * 附件表视图实体类
+ *
+ * @author zhongrj
+ */
+@Data
+@ApiModel(value = "AttachDataVO对象", description = "附件数据表")
+public class AttachDataVO extends AttachData {
+ private static final long serialVersionUID = 1L;
+
+}
--
Gitblit v1.9.3