From c99b51f86ff2cdc98c30f1b9468c5fde3951c30f Mon Sep 17 00:00:00 2001 From: chenweiwei Date: Wed, 22 May 2024 15:19:33 +0800 Subject: [PATCH] 附件相关接口 --- zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/controller/FileController.java | 185 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/domain/McFile.java | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/mapper/McFileMapper.java | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/service/McFileService.java | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/service/impl/McFileServiceImpl.java | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/StyleUtils.java | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioConfig.java | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioProperties.java | 33 +++++++++++++++++++++++++++++++++ zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioService.java | 276 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioUtil.java | 413 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/UploadResponse.java | 15 +++++++++++++++ zr-cloud/zr-modules/zr-schsf/src/main/resources/mapper/McFileMapper.xml | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 12 files changed, 1685 insertions(+), 0 deletions(-) create mode 100644 zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/controller/FileController.java create mode 100644 zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/domain/McFile.java create mode 100644 zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/mapper/McFileMapper.java create mode 100644 zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/service/McFileService.java create mode 100644 zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/service/impl/McFileServiceImpl.java create mode 100644 zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/StyleUtils.java create mode 100644 zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioConfig.java create mode 100644 zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioProperties.java create mode 100644 zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioService.java create mode 100644 zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioUtil.java create mode 100644 zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/UploadResponse.java create mode 100644 zr-cloud/zr-modules/zr-schsf/src/main/resources/mapper/McFileMapper.xml diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/controller/FileController.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/controller/FileController.java new file mode 100644 index 0000000..eb6dbc1 --- /dev/null +++ b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/controller/FileController.java @@ -0,0 +1,185 @@ +package com.chinagas.modules.schsf.controller; + +import com.chinagas.common.core.domain.AjaxResult; +import com.chinagas.common.core.utils.uuid.IdUtils; +import com.chinagas.modules.schsf.domain.McFile; +import com.chinagas.modules.schsf.service.McFileService; +import com.chinagas.modules.schsf.utils.minio.MinioProperties; +import com.chinagas.modules.schsf.utils.minio.MinioUtil; +import io.minio.BucketExistsArgs; +import io.minio.MakeBucketArgs; +import io.minio.MinioClient; +import io.minio.PutObjectArgs; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Random; + +/** + * 市场化收费,文件控制层 + */ +@RestController +@Slf4j +@RequestMapping("/file") +public class FileController { + + @Resource + private MinioUtil minioUtil; + @Autowired + private MinioClient minioClient; + @Autowired + private MinioProperties minioProperties; + @Resource + private McFileService mcFileService; + + private final Long maxSize = (long) (1024 * 1024 * 20); + + + /** + * 批量文件上传 + * + * @param file + * @return + */ + @PostMapping("/upload") + public AjaxResult minioUpload(MultipartFile[] file) { + // 判断文件是否为空 + if (null == file || 0 == file.length) { + return null; + } + if (!cheakIsRepeat(file)) { + throw new RuntimeException("文件名不允许重复"); + } + String bucketName = minioProperties.getBucket(); + ArrayList list = new ArrayList<>(); + String fileName = null; + try { + // 判断存储桶是否存在 不存在则创建 + createBucket(bucketName); + for (int i = 0; i < file.length; i++) { + // 文件名 + String originalFilename = file[i].getOriginalFilename(); + // 判断大小 + if (file[i].getSize() > maxSize) { + throw new RuntimeException("文件" + "<" + originalFilename + ">" + "过大,请上传小于20M文件!"); + } + String file_uuid = IdUtils.fastSimpleUUID(); + McFile McFile = new McFile(); + // 后缀 + String extension = originalFilename.substring(originalFilename.lastIndexOf(".")); + if (!extension.equalsIgnoreCase(".pdf") + && !extension.equalsIgnoreCase(".doc") + && !extension.equalsIgnoreCase(".docx") + && !extension.equalsIgnoreCase(".xlsx") + && !extension.equalsIgnoreCase(".xls") + && !extension.equalsIgnoreCase(".jpg") + && !extension.equalsIgnoreCase(".jpeg") + && !extension.equalsIgnoreCase(".png")) { + throw new RuntimeException("文件" + "<" + originalFilename + ">" + "格式不正确"); + } + // 新的文件名 = 时间戳_随机数.后缀名 + assert originalFilename != null; + long now = System.currentTimeMillis() / 1000; + String format = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + fileName = format + "_" + now + "_" + new Random().nextInt(1000) + extension; + // 启动minio客户端,文件名传新生成的随机名 + minioClient.putObject( + PutObjectArgs.builder().bucket(bucketName).object(fileName).stream( + file[i].getInputStream(), file[i].getSize(), -1) + .contentType(file[i].getContentType()) + .build()); + // 用于图片预览,直接访问桶名+文件名 + String url = minioProperties.getEndpoint() + "/" + bucketName + "/" + fileName; + // 持久化存储原文件名 + McFile.setFileName(originalFilename); + McFile.setUrl(url); + McFile.setUuid(file_uuid); + McFile.setExtension(extension); + McFile.setFileSize(file[i].getSize()); + list.add(McFile); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + list.stream().forEach(o -> { + mcFileService.insertMcFile(o); + }); + return AjaxResult.success(list); + } + + public void createBucket(String bucketName) throws Exception { + if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + } + } + + /** + * 文件下载 + * + * @param + * @param res + * @return + */ + @GetMapping("/download") + public AjaxResult download(String uuid, HttpServletResponse res) { + McFile McFile = mcFileService.selectMcFileByUuid(uuid); + if (McFile == null) { + throw new RuntimeException("文件不存在或已被删除!"); + } + minioUtil.download(McFile, res); + return AjaxResult.success(); + } + + + @GetMapping("/getByUuid/{uuid}") + public AjaxResult download(@PathVariable("uuid") String uuid) { + McFile McFile = mcFileService.selectMcFileByUuid(uuid); + if (McFile == null) { + throw new RuntimeException("文件不存在或已被删除!"); + } + return AjaxResult.success(McFile); + } + + +// /** +// * 批量下载 +// * +// * @param uuid +// * @param zip +// * @param res +// * @param req +// */ +// @GetMapping("/batchDownload") +// public void batchDownload(String[] uuid, String zip, HttpServletResponse res, HttpServletRequest req) { +// List list = mcFileService.selectFileByUuid(uuid); +//// ArrayList fileNames = new ArrayList<>(); +//// list.stream().forEach(o -> { +//// // 获取minio中的真实文件名 +//// fileNames.add(o.getUrl().substring(o.getUrl().indexOf("t/")+2)); +//// }); +// minioUtil.batchDownload1(list, zip, res, req); +// } + + + + + private static boolean cheakIsRepeat(MultipartFile[] array) { + HashSet hashSet = new HashSet<>(); + for (int i = 0; i < array.length; i++) { + hashSet.add(array[i]); + } + if (hashSet.size() == array.length) { + return true; + } else { + return false; + } + } +} diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/domain/McFile.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/domain/McFile.java new file mode 100644 index 0000000..5b99476 --- /dev/null +++ b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/domain/McFile.java @@ -0,0 +1,142 @@ +package com.chinagas.modules.schsf.domain; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.chinagas.common.core.web.domain.BaseEntity; + +@ExcelIgnoreUnannotated +public class McFile extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 自增id */ + private Long id; + + /** 唯一标识 */ + @ExcelProperty(value = "唯一标识") + private String uuid; + + /** 文件名称 */ + @ExcelProperty(value = "文件名称") + private String fileName; + + /** 文件拓展名,如.txt */ + @ExcelProperty(value = "文件拓展名,如.txt") + private String extension; + + /** 文件路径 */ + @ExcelProperty(value = "文件路径") + private String path; + + /** 下载链接 */ + @ExcelProperty(value = "下载链接") + private String url; + + /** 删除标志(0:未删除,1:已删除) */ + @ExcelProperty(value = "删除标志") + private String defFlag; + + /** 是否被引用过(0:未被引用过,1:已被引用过) */ + @ExcelProperty(value = "是否被引用过") + private String cited; + + /** 被引用次数 */ + @ExcelProperty(value = "被引用次数") + private Long count; + + /** 文件大小(kb) */ + @ExcelProperty(value = "文件大小(kb)") + private Long fileSize; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setUuid(String uuid) + { + this.uuid = uuid; + } + + public String getUuid() + { + return uuid; + } + public void setFileName(String fileName) + { + this.fileName = fileName; + } + + public String getFileName() + { + return fileName; + } + public void setExtension(String extension) + { + this.extension = extension; + } + + public String getExtension() + { + return extension; + } + public void setPath(String path) + { + this.path = path; + } + + public String getPath() + { + return path; + } + public void setUrl(String url) + { + this.url = url; + } + + public String getUrl() + { + return url; + } + public void setDefFlag(String defFlag) + { + this.defFlag = defFlag; + } + + public String getDefFlag() + { + return defFlag; + } + public void setCited(String cited) + { + this.cited = cited; + } + + public String getCited() + { + return cited; + } + public void setCount(Long count) + { + this.count = count; + } + + public Long getCount() + { + return count; + } + public void setFileSize(Long fileSize) + { + this.fileSize = fileSize; + } + + public Long getFileSize() + { + return fileSize; + } + +} diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/mapper/McFileMapper.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/mapper/McFileMapper.java new file mode 100644 index 0000000..8795d1d --- /dev/null +++ b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/mapper/McFileMapper.java @@ -0,0 +1,65 @@ +package com.chinagas.modules.schsf.mapper; + +import com.chinagas.modules.schsf.domain.McFile; + +import java.util.List; + +/** + * 市场化收费相关文件Mapper接口 + * + * @author lidwd + * @date 2024-05-22 + */ +public interface McFileMapper +{ + /** + * 查询市场化收费相关文件 + * + * @param id 市场化收费相关文件主键 + * @return 市场化收费相关文件 + */ + public McFile selectMcFileById(Long id); + + /** + * 查询市场化收费相关文件列表 + * + * @param mcFile 市场化收费相关文件 + * @return 市场化收费相关文件集合 + */ + public List selectMcFileList(McFile mcFile); + + /** + * 新增市场化收费相关文件 + * + * @param mcFile 市场化收费相关文件 + * @return 结果 + */ + public int insertMcFile(McFile mcFile); + + /** + * 修改市场化收费相关文件 + * + * @param mcFile 市场化收费相关文件 + * @return 结果 + */ + public int updateMcFile(McFile mcFile); + + /** + * 删除市场化收费相关文件 + * + * @param id 市场化收费相关文件主键 + * @return 结果 + */ + public int deleteMcFileById(Long id); + + /** + * 批量删除市场化收费相关文件 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteMcFileByIds(Long[] ids); + + McFile selectMcFileByUuid(String uuid); + +} diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/service/McFileService.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/service/McFileService.java new file mode 100644 index 0000000..fe3146d --- /dev/null +++ b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/service/McFileService.java @@ -0,0 +1,59 @@ +package com.chinagas.modules.schsf.service; + +import com.chinagas.modules.schsf.domain.McFile; + +import java.util.List; + +public interface McFileService { + + /** + * 查询市场化收费相关文件 + * + * @param id 市场化收费相关文件主键 + * @return 市场化收费相关文件 + */ + public McFile selectMcFileById(Long id); + + /** + * 查询市场化收费相关文件列表 + * + * @param mcFile 市场化收费相关文件 + * @return 市场化收费相关文件集合 + */ + public List selectMcFileList(McFile mcFile); + + /** + * 新增市场化收费相关文件 + * + * @param mcFile 市场化收费相关文件 + * @return 结果 + */ + public int insertMcFile(McFile mcFile); + + /** + * 修改市场化收费相关文件 + * + * @param mcFile 市场化收费相关文件 + * @return 结果 + */ + public int updateMcFile(McFile mcFile); + + /** + * 批量删除市场化收费相关文件 + * + * @param ids 需要删除的市场化收费相关文件主键集合 + * @return 结果 + */ + public int deleteMcFileByIds(Long[] ids); + + /** + * 删除市场化收费相关文件信息 + * + * @param id 市场化收费相关文件主键 + * @return 结果 + */ + public int deleteMcFileById(Long id); + + McFile selectMcFileByUuid(String uuid); + +} diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/service/impl/McFileServiceImpl.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/service/impl/McFileServiceImpl.java new file mode 100644 index 0000000..6f954a8 --- /dev/null +++ b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/service/impl/McFileServiceImpl.java @@ -0,0 +1,100 @@ +package com.chinagas.modules.schsf.service.impl; + +import com.chinagas.common.core.utils.DateUtils; +import com.chinagas.common.security.utils.SecurityUtils; +import com.chinagas.modules.schsf.service.McFileService; +import com.chinagas.modules.schsf.domain.McFile; +import com.chinagas.modules.schsf.mapper.McFileMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 市场化收费相关文件Service业务层处理 + * + * @author lidwd + * @date 2024-05-22 + */ +@Service +public class McFileServiceImpl implements McFileService { + @Autowired + private McFileMapper mcFileMapper; + + /** + * 查询市场化收费相关文件 + * + * @param id 市场化收费相关文件主键 + * @return 市场化收费相关文件 + */ + @Override + public McFile selectMcFileById(Long id) { + return mcFileMapper.selectMcFileById(id); + } + + /** + * 查询市场化收费相关文件列表 + * + * @param mcFile 市场化收费相关文件 + * @return 市场化收费相关文件 + */ + @Override + public List selectMcFileList(McFile mcFile) { + return mcFileMapper.selectMcFileList(mcFile); + } + + /** + * 新增市场化收费相关文件 + * + * @param mcFile 市场化收费相关文件 + * @return 结果 + */ + @Override + public int insertMcFile(McFile mcFile) { + mcFile.setCreateTime(DateUtils.getNowLocal()); + mcFile.setCreateBy(SecurityUtils.getUserId().toString()); + mcFile.setUpdateTime(DateUtils.getNowLocal()); + mcFile.setUpdateBy(SecurityUtils.getUserId().toString()); + return mcFileMapper.insertMcFile(mcFile); + } + + /** + * 修改市场化收费相关文件 + * + * @param mcFile 市场化收费相关文件 + * @return 结果 + */ + @Override + public int updateMcFile(McFile mcFile) { + mcFile.setUpdateTime(DateUtils.getNowLocal()); + mcFile.setUpdateBy(SecurityUtils.getUserId().toString()); + return mcFileMapper.updateMcFile(mcFile); + } + + /** + * 批量删除市场化收费相关文件 + * + * @param ids 需要删除的市场化收费相关文件主键 + * @return 结果 + */ + @Override + public int deleteMcFileByIds(Long[] ids) { + return mcFileMapper.deleteMcFileByIds(ids); + } + + /** + * 删除市场化收费相关文件信息 + * + * @param id 市场化收费相关文件主键 + * @return 结果 + */ + @Override + public int deleteMcFileById(Long id) { + return mcFileMapper.deleteMcFileById(id); + } + + @Override + public McFile selectMcFileByUuid(String uuid) { + return mcFileMapper.selectMcFileByUuid(uuid); + } +} diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/StyleUtils.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/StyleUtils.java new file mode 100644 index 0000000..02165e3 --- /dev/null +++ b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/StyleUtils.java @@ -0,0 +1,91 @@ +package com.chinagas.modules.schsf.utils; + +import com.alibaba.excel.write.metadata.style.WriteCellStyle; +import com.alibaba.excel.write.metadata.style.WriteFont; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.VerticalAlignment; + +/** + * EasyExcel 样式工具类 + * + * @author zhl + * @date 2023-12-29 + */ +public class StyleUtils { + /** + * 标题样式 + * @return + */ + public static WriteCellStyle getHeadStyle(){ + // 头的策略 + WriteCellStyle headWriteCellStyle = new WriteCellStyle(); + // 背景颜色 +// headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE1.getIndex()); +// headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); + + // 字体 + WriteFont headWriteFont = new WriteFont(); + headWriteFont.setFontName("宋体");//设置字体名字 + headWriteFont.setFontHeightInPoints((short)14);//设置字体大小 + headWriteFont.setBold(true);//字体加粗 + headWriteCellStyle.setWriteFont(headWriteFont); //在样式用应用设置的字体; + + // 样式 + headWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框; + headWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色; + headWriteCellStyle.setBorderLeft(BorderStyle.THIN); //设置左边框; + headWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色; + headWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框; + headWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色; + headWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框; + headWriteCellStyle.setTopBorderColor((short) 0); //设置顶边框颜色; + + headWriteCellStyle.setWrapped(true); //设置自动换行; + + headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//设置水平对齐的样式为居中对齐; + headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //设置垂直对齐的样式为居中对齐; + headWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适 + + return headWriteCellStyle; + } + + + /** + * 内容样式 + * @return + */ + public static WriteCellStyle getContentStyle(){ + // 内容的策略 + WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); + + // 背景绿色 + // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定 +// contentWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex()); +// contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); + + // 设置字体 + WriteFont contentWriteFont = new WriteFont(); + contentWriteFont.setFontHeightInPoints((short) 12);//设置字体大小 + contentWriteFont.setFontName("宋体"); //设置字体名字 + contentWriteCellStyle.setWriteFont(contentWriteFont);//在样式用应用设置的字体; + + //设置样式; + contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框; + contentWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色; + contentWriteCellStyle.setBorderLeft(BorderStyle.THIN); //设置左边框; + contentWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色; + contentWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框; + contentWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色; + contentWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框; + contentWriteCellStyle.setTopBorderColor((short) 0); ///设置顶边框颜色; + + contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 水平居中 + contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中 + contentWriteCellStyle.setWrapped(true); //设置自动换行; + +// contentWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适 + + return contentWriteCellStyle; + } +} diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioConfig.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioConfig.java new file mode 100644 index 0000000..7ea9307 --- /dev/null +++ b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioConfig.java @@ -0,0 +1,66 @@ +package com.chinagas.modules.schsf.utils.minio; + +import io.minio.MinioClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(MinioProperties.class) +public class MinioConfig { + + @Autowired + private MinioProperties minioProperties; + + @Bean + public MinioClient minioClient(){ + return MinioClient.builder() + .endpoint(minioProperties.getEndpoint()) + .credentials(minioProperties.getAccessKey(),minioProperties.getSecretKey()) + .build(); + } + + /** + * 获取 MinioClient + * 取消ssl认证 + */ +// @Bean +// public MinioClient minioClient() throws NoSuchAlgorithmException, KeyManagementException { +//// return MinioClient.builder().endpoint(minioInfo.getEndpoint()) +//// .credentials(minioInfo.getAccesskey(),minioInfo.getSecretkey()) +//// .build(); +// //取消ssl认证 +// final TrustManager[] trustAllCerts = new TrustManager[]{ +// new X509TrustManager() { +// @Override +// public void checkClientTrusted(X509Certificate[] x509Certificates, String s) { +// } +// @Override +// public void checkServerTrusted(X509Certificate[] x509Certificates, String s) { +// } +// @Override +// public X509Certificate[] getAcceptedIssuers() { +// return new X509Certificate[]{}; +// } +// } +// }; +// +// X509TrustManager x509TrustManager = (X509TrustManager) trustAllCerts[0]; +// final SSLContext sslContext = SSLContext.getInstance("SSL"); +// sslContext.init(null, trustAllCerts, new SecureRandom()); +// final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); +// OkHttpClient.Builder builder = new OkHttpClient.Builder(); +// builder.sslSocketFactory(sslSocketFactory,x509TrustManager); +// +// builder.hostnameVerifier((s, sslSession) -> true); +// OkHttpClient okHttpClient = builder.build(); +// +// return MinioClient.builder() +// .endpoint(minioProperties.getEndpoint()) +// .httpClient(okHttpClient).region("eu-west-1") +// .credentials(minioProperties.getAccessKey() +// , minioProperties.getSecretKey()).build(); +// } + +} diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioProperties.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioProperties.java new file mode 100644 index 0000000..703d479 --- /dev/null +++ b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioProperties.java @@ -0,0 +1,33 @@ +package com.chinagas.modules.schsf.utils.minio; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@ConfigurationProperties(prefix = "minio") +@Component +@Data +public class MinioProperties { + + /** + * 连接地址 + */ + private String endpoint; + /** + * 用户名 + */ + private String accessKey; + /** + * 密码 + */ + private String secretKey; + /** + * 域名 + */ + private String nginxHost; + /** + * 默认文件桶 + */ + private String bucket; + +} diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioService.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioService.java new file mode 100644 index 0000000..2cbe580 --- /dev/null +++ b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioService.java @@ -0,0 +1,276 @@ +package com.chinagas.modules.schsf.utils.minio;//package com.chinagas.modules.insight.utils.minio; +// +//import com.google.common.collect.Lists; +//import io.minio.*; +//import io.minio.errors.ErrorResponseException; +//import io.minio.errors.InvalidResponseException; +//import io.minio.errors.XmlParserException; +//import io.minio.messages.DeleteError; +//import io.minio.messages.DeleteObject; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Component; +//import org.springframework.web.multipart.MultipartFile; +//import sun.misc.BASE64Encoder; +// +//import javax.servlet.ServletOutputStream; +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +//import java.io.BufferedOutputStream; +//import java.io.IOException; +//import java.io.InputStream; +//import java.io.UnsupportedEncodingException; +//import java.security.NoSuchAlgorithmException; +//import java.util.List; +//import java.util.stream.Collectors; +//import java.util.zip.ZipEntry; +//import java.util.zip.ZipOutputStream; +// +//@Component +//@Slf4j +//public class MinioService { +// @Autowired +// private MinioClient minioClient; +// +// /** +// * description: 判断bucket是否存在,不存在则创建 +// * @return: void +// */ +// public void existBucket(String name) { +// try { +// boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build()); +// if (!exists) { +// minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build()); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// /** +// * 创建存储bucket +// * @param bucketName 存储bucket名称 +// * @return Boolean +// */ +// public Boolean makeBucket(String bucketName) { +// try { +// minioClient.makeBucket(MakeBucketArgs.builder() +// .bucket(bucketName) +// .build()); +// } catch (Exception e) { +// e.printStackTrace(); +// return false; +// } +// return true; +// } +// +// /** +// * 删除存储bucket +// * @param bucketName 存储bucket名称 +// * @return Boolean +// */ +// public Boolean removeBucket(String bucketName) { +// try { +// minioClient.removeBucket(RemoveBucketArgs.builder() +// .bucket(bucketName) +// .build()); +// } catch (Exception e) { +// e.printStackTrace(); +// return false; +// } +// return true; +// } +// +// /** +// * description: 上传文件 +// * @param multipartFile +// * @return: java.lang.String +// */ +// public List upload(MultipartFile[] multipartFile) { +// +// List txFileinfos = Lists.newArrayList(); +// for (MultipartFile file : multipartFile) { +// String fileName = file.getOriginalFilename(); +// String[] split = fileName.split("\\."); +// String suffix = null; +// if (split.length > 1) { +// fileName = split[0] + "_" + System.currentTimeMillis() + "." + split[1]; +// suffix = split[1]; +// } else { +// fileName = fileName + System.currentTimeMillis(); +// } +// +// InputStream in = null; +// try { +// in = file.getInputStream(); +// minioClient.putObject(PutObjectArgs.builder() +// .bucket(bucketName) +// .object(fileName) +// .stream(in, in.available(), -1) +// .contentType(file.getContentType()) +// .build() +// ); +// TxFileinfo txFileinfo = getTxFileinfo(file, fileName, suffix); +// txFileinfos.add(txFileinfo); +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// if (in != null) { +// try { +// in.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } +// } +// return txFileinfos; +// } +// +// +// /** +// * 通过文件名称下载文件 +// * +// * +// */ +// public void download(String filename, HttpServletResponse res, HttpServletRequest req) throws IOException, +// InvalidKeyException, +// InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException { +// BucketExistsArgs bucketArgs = BucketExistsArgs.builder().bucket(bucketName).build(); +// boolean bucketExists = minioClient.bucketExists(bucketArgs); +// GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(bucketName) +// .object(filename).build(); +// try (GetObjectResponse response = minioClient.getObject(objectArgs)) { +// byte[] buf = new byte[1024]; +// int len; +// try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()) { +// while ((len = response.read(buf)) != -1) { +// os.write(buf, 0, len); +// } +// os.flush(); +// byte[] bytes = os.toByteArray(); +// res.setCharacterEncoding("utf-8"); +// res.setContentType("application/force-download");// 设置强制下载不打开 +// res.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); +//// filenameEncoding 方法兼容不同浏览器编码 +// res.addHeader("Content-Disposition", "attachment;fileName=" + filenameEncoding(filename,req)); +// try (ServletOutputStream stream = res.getOutputStream()) { +// stream.write(bytes); +// stream.flush(); +// } +// } +// +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// /** +// * @description: 批量下载 +// * @date: 2022/8/17 16:50 +// * @param: filenames: 多个文件名称 +// * @Param: zip: 压缩包名称 +// * @Param: res: 响应对象 +// * @return: void +// **/ +// public void batchDownload(List filenames, String zip, HttpServletResponse res, HttpServletRequest req){ +// try { +// BucketExistsArgs bucketArgs = BucketExistsArgs.builder().bucket(bucketName).build(); +// boolean bucketExists = minioClient.bucketExists(bucketArgs); +// BufferedOutputStream bos = null; +// res.reset(); +// bos = new BufferedOutputStream(res.getOutputStream()); +// ZipOutputStream out = new ZipOutputStream(bos); +// res.setHeader("Access-Control-Allow-Origin", "*"); +// for (int i=0;i 0) { +// out.write(buf, 0, length); +// } +// } +// out.close(); +// bos.close(); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// /** +// * 设置不同浏览器编码 +// * @param filename 文件名称 +// * @param request 请求对象 +// */ +// public static String filenameEncoding(String filename, HttpServletRequest request) throws UnsupportedEncodingException { +// // 获得请求头中的User-Agent +// String agent = request.getHeader("User-Agent"); +// // 根据不同的客户端进行不同的编码 +// +// if (agent.contains("MSIE")) { +// // IE浏览器 +// filename = URLEncoder.encode(filename, "utf-8"); +// } else if (agent.contains("Firefox")) { +// // 火狐浏览器 +// BASE64Encoder base64Encoder = new BASE64Encoder(); +// filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; +// } else { +// // 其它浏览器 +// filename = URLEncoder.encode(filename, "utf-8"); +// } +// return filename; +// } +// +// +// /** +// * 批量删除文件对象 +// * @param bucketName 存储bucket名称 +// * @param objects 对象名称集合 +// */ +// public Iterable> removeObjects(String bucketName, List objects) { +// List dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList()); +// Iterable> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build()); +// return results; +// } +// +// /** +// * @description:获取文件预览接口 +// * @date: 2022/8/18 9:44 +// * @param: fileName: 文件名 +// * @Param: bucketName: 桶名 +// * @Param: previewExpiry: 预览到期时间(小时) +// * @return: java.lang.String +// **/ +// public String getPreviewUrl(String fileName, String bucketName,Integer previewExpiry) { +// if (StringUtils.isNotBlank(fileName)) { +// bucketName = StringUtils.isNotBlank(bucketName) ? bucketName : this.bucketName; +// try { +// minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileName).build()); +// if (null != previewExpiry){ +// return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder() +// .method(Method.GET) +// .bucket(bucketName) +// .object(fileName) +// .expiry(previewExpiry, TimeUnit.HOURS) +// .build()); +// }else { +// return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder() +// .method(Method.GET) +// .bucket(bucketName) +// .object(fileName) +// .build()); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// return null; +// } +//} diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioUtil.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioUtil.java new file mode 100644 index 0000000..47d039b --- /dev/null +++ b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/MinioUtil.java @@ -0,0 +1,413 @@ +package com.chinagas.modules.schsf.utils.minio; + +import com.chinagas.common.core.utils.uuid.IdUtils; +import com.chinagas.modules.schsf.domain.McFile; +import io.minio.*; +import io.minio.errors.*; +import io.minio.http.Method; +import io.minio.messages.Bucket; +import lombok.extern.slf4j.Slf4j; +import net.coobird.thumbnailator.Thumbnails; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemFactory; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; +import sun.misc.BASE64Encoder; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +@Component +@Slf4j +public class MinioUtil { + + @Autowired + private MinioProperties minioProperties; + + @Autowired + private MinioClient minioClient; + + private final Long maxSize = (long) (1024 * 1024); + + /** + * 创建bucket + */ + public void createBucket(String bucketName) throws Exception { + if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + } + } + + /** + * 上传文件 + */ + public List uploadFile(MultipartFile[] file, String bucketName) throws Exception { + // 判断文件是否为空 + if (null == file || 0 == file.length) { + return null; + } +// HashMap map = new HashMap<>(); + ArrayList list = new ArrayList<>(); + String fileName = null; + // 判断存储桶是否存在 不存在则创建 + createBucket(bucketName); + for (int i = 0; i < file.length; i++) { + String file_uuid = IdUtils.fastSimpleUUID(); + McFile McFile = new McFile(); + // 文件名 + String originalFilename = file[i].getOriginalFilename(); + // 后缀 + String extension = originalFilename.substring(originalFilename.lastIndexOf(".")); + if (!extension.equalsIgnoreCase("pdf") || !extension.equalsIgnoreCase("docx") + || !extension.equalsIgnoreCase("xlsx") || !extension.equalsIgnoreCase("xls")) { + throw new RuntimeException("文件" + originalFilename + "文件格式不正确"); + } + // 新的文件名 = 时间戳_随机数.后缀名 + assert originalFilename != null; + long now = System.currentTimeMillis() / 1000; + String format = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + fileName = format + "_" + now + "_" + new Random().nextInt(1000) + extension; + // 开始上传 + log.info("file压缩前大小:{}", file[i].getSize()); + if (file[i].getSize() > maxSize) { + FileItemFactory fileItemFactory = new DiskFileItemFactory(); + FileItem fileItem = fileItemFactory.createItem(fileName, "text/plain", true, fileName); + OutputStream outputStream = fileItem.getOutputStream(); + Thumbnails.of(file[i].getInputStream()).scale(1f).outputFormat(originalFilename.substring(originalFilename.lastIndexOf(".") + 1)).outputQuality(0.25f).toOutputStream(outputStream); + file[i] = new CommonsMultipartFile(fileItem); + } + log.info("file压缩后大小:{}", file[i].getSize()); + minioClient.putObject( + PutObjectArgs.builder().bucket(bucketName).object(fileName).stream( + file[i].getInputStream(), file[i].getSize(), -1) + .contentType(file[i].getContentType()) + .build()); + String url = minioProperties.getEndpoint() + "/" + bucketName + "/" + fileName; +// String urlHost = minioProperties.getNginxHost() + "/" + bucketName + "/" + fileName; +// map.put("bucket", bucketName); +// map.put("url", url); + McFile.setFileName(originalFilename); + McFile.setUrl(url); + McFile.setUuid(file_uuid); + McFile.setExtension(extension); + list.add(McFile); + } + return list; + } + + /** + * 获取全部bucket + * + * @return + */ + public List getAllBuckets() throws Exception { + return minioClient.listBuckets(); + } + + /** + * 根据bucketName获取信息 + * + * @param bucketName bucket名称 + */ + public Optional getBucket(String bucketName) throws IOException, InvalidKeyException, NoSuchAlgorithmException, InsufficientDataException, InvalidResponseException, InternalException, ErrorResponseException, ServerException, XmlParserException, ServerException { + return minioClient.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst(); + } + + /** + * 根据bucketName删除信息 + * + * @param bucketName bucket名称 + */ + public void removeBucket(String bucketName) throws Exception { + minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); + } + + /** + * 获取⽂件外链 + * + * @param bucketName bucket名称 + * @param objectName ⽂件名称 + * @param expires 过期时间 <=7 + * @return url + */ + public String getObjectURL(String bucketName, String objectName, Integer expires) throws Exception { + return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).expiry(expires).build()); + } + + /** + * 获取⽂件 + * + * @param bucketName bucket名称 + * @param objectName ⽂件名称 + * @return ⼆进制流 + */ + public InputStream getObject(String bucketName, String objectName) throws Exception { + return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); + } + + /** + * 上传⽂件 + * + * @param bucketName bucket名称 + * @param objectName ⽂件名称 + * @param stream ⽂件流 + * @throws Exception https:// docs.minio.io/cn/java-minioClient-api-reference.html#putObject + */ + public void putObject(String bucketName, String objectName, InputStream stream) throws + Exception { + minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(stream, stream.available(), -1).contentType(objectName.substring(objectName.lastIndexOf("."))).build()); + } + + /** + * 上传⽂件 + * + * @param bucketName bucket名称 + * @param objectName ⽂件名称 + * @param stream ⽂件流 + * @param size ⼤⼩ + * @param contextType 类型 + * @throws Exception https:// docs.minio.io/cn/java-minioClient-api-reference.html#putObject + */ + public void putObject(String bucketName, String objectName, InputStream stream, long + size, String contextType) throws Exception { + minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(stream, size, -1).contentType(contextType).build()); + } + + /** + * 获取⽂件信息 + * + * @param bucketName bucket名称 + * @param objectName ⽂件名称 + * @throws Exception https:// docs.minio.io/cn/java-minioClient-api-reference.html#statObject + */ + public StatObjectResponse getObjectInfo(String bucketName, String objectName) throws Exception { + return minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); + } + + /** + * 删除⽂件 + * + * @param bucketName bucket名称 + * @param objectName ⽂件名称 + * @throws Exception https:// docs.minio.io/cn/java-minioClient-apireference.html#removeObject + */ + public void removeObject(String bucketName, String objectName) throws Exception { + minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build()); + } + + + /*** + * 上传视频 + * @param file + * @param bucketName + * @return + * @throws Exception + */ + public UploadResponse uploadVideo(MultipartFile file, String bucketName) throws Exception { + // 判断文件是否为空 + if (null == file || 0 == file.getSize()) { + return null; + } + // 判断存储桶是否存在 不存在则创建 + createBucket(bucketName); + // 文件名 + String originalFilename = file.getOriginalFilename(); + // 新的文件名 = 时间戳_随机数.后缀名 + assert originalFilename != null; + long now = System.currentTimeMillis() / 1000; + String format = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + String fileName = format + "_" + now + "_" + new Random().nextInt(1000) + + originalFilename.substring(originalFilename.lastIndexOf(".")); + // 开始上传 + log.info("file大小:{}", file.getSize()); + minioClient.putObject( + PutObjectArgs.builder().bucket(bucketName).object(fileName).stream( + file.getInputStream(), file.getSize(), -1) + .contentType("video/mp4") + .build()); + String url = minioProperties.getEndpoint() + "/" + bucketName + "/" + fileName; + String urlHost = minioProperties.getNginxHost() + "/" + bucketName + "/" + fileName; + return new UploadResponse(url, urlHost); + } + + /** + * 文件下载 + * + * @param McFile 文件实体 + * @param res response + * @return Boolean + */ + public void download(McFile McFile, HttpServletResponse res) { +// res.reset(); + try (InputStream inputStream = minioClient.getObject(GetObjectArgs.builder() + .bucket(minioProperties.getBucket()) + .object(McFile.getUrl().substring(McFile.getUrl().indexOf("t/")+2)) + .build())) { + ServletOutputStream outputStream = res.getOutputStream(); + res.setContentType("application/octet-stream"); + res.setCharacterEncoding("utf-8"); + res.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(McFile.getFileName(), "UTF-8")); + byte[] bytes = new byte[1024]; + int len; + while ((len = inputStream.read(bytes)) > 0) { + outputStream.write(bytes, 0, len); + } + outputStream.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 批量下载 + * + * @param filenames + * @param zip + * @param res + * @param req + */ + public void batchDownload(List filenames, String zip, HttpServletResponse res, HttpServletRequest req) { + try { + BucketExistsArgs bucketArgs = BucketExistsArgs.builder().bucket(minioProperties.getBucket()).build(); + boolean bucketExists = minioClient.bucketExists(bucketArgs); + BufferedOutputStream bos = null; + long now = System.currentTimeMillis() / 1000; + String format = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + String fileName = format + "_" + now + "_" + new Random().nextInt(1000); +// res.reset(); + bos = new BufferedOutputStream(res.getOutputStream()); + ZipOutputStream out = new ZipOutputStream(bos); + res.setHeader("Access-Control-Allow-Origin", "*"); + for (int i = 0; i < filenames.size(); i++) { + GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(minioProperties.getBucket()) + .object(filenames.get(i)).build(); + InputStream object = minioClient.getObject(objectArgs); + byte buf[] = new byte[1024]; + int length = 0; + res.setCharacterEncoding("utf-8"); + // 设置强制下载不打开 + res.setContentType("application/force-download"); + res.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + res.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoding(fileName, req) + ".zip"); + out.putNextEntry(new ZipEntry(filenames.get(i))); + while ((length = object.read(buf)) > 0) { + out.write(buf, 0, length); + } + } + out.close(); + bos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void batchDownload1(List list, String zip, HttpServletResponse res, HttpServletRequest req) { + try { + BucketExistsArgs bucketArgs = BucketExistsArgs.builder().bucket(minioProperties.getBucket()).build(); + boolean bucketExists = minioClient.bucketExists(bucketArgs); + BufferedOutputStream bos = null; + long now = System.currentTimeMillis() / 1000; + String format = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + String fileName = format + "_" + now + "_" + new Random().nextInt(1000); +// res.reset(); + bos = new BufferedOutputStream(res.getOutputStream()); + ZipOutputStream out = new ZipOutputStream(bos); + res.setHeader("Access-Control-Allow-Origin", "*"); + for (McFile McFile : list) { + GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(minioProperties.getBucket()) + .object(McFile.getUrl().substring(McFile.getUrl().indexOf("t/")+2)).build(); + InputStream object = minioClient.getObject(objectArgs); + byte buf[] = new byte[1024]; + int length = 0; + res.setCharacterEncoding("utf-8"); + // 设置强制下载不打开 + res.setContentType("application/force-download"); + res.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + res.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoding(fileName, req) + ".zip"); + out.putNextEntry(new ZipEntry(McFile.getFileName())); + while ((length = object.read(buf)) > 0) { + out.write(buf, 0, length); + } + } + out.close(); + bos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 设置不同浏览器编码 + * + * @param filename 文件名称 + * @param request 请求对象 + */ + public static String filenameEncoding(String filename, HttpServletRequest request) throws UnsupportedEncodingException { + // 获得请求头中的User-Agent + String agent = request.getHeader("User-Agent"); + // 根据不同的客户端进行不同的编码 + + if (agent.contains("MSIE")) { + // IE浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } else if (agent.contains("Firefox")) { + // 火狐浏览器 + BASE64Encoder base64Encoder = new BASE64Encoder(); + filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; + } else { + // 其它浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } + return filename; + } + + /** + * 预览图片 + * + * @param fileName + * @return + */ + public String preview(String fileName) { + // 查看文件地址 + GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket(minioProperties.getBucket()).object(fileName).method(Method.GET).build(); + try { + String url = minioClient.getPresignedObjectUrl(build); + return url; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 删除 + * + * @param fileName + * @return + * @throws Exception + */ + public boolean remove(String fileName) { + try { + minioClient.removeObject(RemoveObjectArgs.builder().bucket(minioProperties.getBucket()).object(fileName).build()); + } catch (Exception e) { + return false; + } + return true; + } +} diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/UploadResponse.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/UploadResponse.java new file mode 100644 index 0000000..37dd23f --- /dev/null +++ b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/minio/UploadResponse.java @@ -0,0 +1,15 @@ +package com.chinagas.modules.schsf.utils.minio; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UploadResponse { + + private String minIoUrl; + + private String nginxUrl; +} diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/resources/mapper/McFileMapper.xml b/zr-cloud/zr-modules/zr-schsf/src/main/resources/mapper/McFileMapper.xml new file mode 100644 index 0000000..7675389 --- /dev/null +++ b/zr-cloud/zr-modules/zr-schsf/src/main/resources/mapper/McFileMapper.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + select id, + uuid, + file_name, + extension, + path, + url, + create_time, + create_by, + update_time, + update_by, + def_flag, + cited, + count, + file_size + from mc_file + + + + + + + + + + + + + + + insert into mc_file + + + id, + + + uuid, + + + file_name, + + + extension, + + + path, + + + url, + + + create_time, + + + create_by, + + + update_time, + + + update_by, + + + def_flag, + + + cited, + + + count, + + + file_size, + + + + + #{id}, + + + #{uuid}, + + + #{fileName}, + + + #{extension}, + + + #{path}, + + + #{url}, + + + #{createTime}, + + + #{createBy}, + + + #{updateTime}, + + + #{updateBy}, + + + #{defFlag}, + + + #{cited}, + + + #{count}, + + + #{fileSize}, + + + + + + update mc_file + + + uuid = #{uuid}, + + + file_name = #{fileName}, + + + extension = #{extension}, + + + path = #{path}, + + + url = #{url}, + + + create_time = #{createTime}, + + + create_by = #{createBy}, + + + update_time = #{updateTime}, + + + update_by = #{updateBy}, + + + def_flag = #{defFlag}, + + + cited = #{cited}, + + + count = #{count}, + + + file_size = #{fileSize}, + + + where id = #{id} + + + + delete + from mc_file + where id = #{id} + + + + delete + from mc_file where id in + + #{id} + + + -- libgit2 0.21.2