From 317f6852e03c8fa2b5feb2245fbe3ab05114fe57 Mon Sep 17 00:00:00 2001 From: zhaowenyuan Date: Mon, 24 Jun 2024 14:58:11 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BA=94=E7=BB=9F=E4=B8=80=E5=95=86?= =?UTF-8?q?=E6=88=B7=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/excel/utils/ExcelUtils.java | 75 ++++++++++++------- .../chushang/oss/feign/RemoteOssService.java | 15 ++++ .../oss/remote/RemoteFileController.java | 11 +++ .../oss/service/FileSourceService.java | 61 +++++++++++++++ 4 files changed, 135 insertions(+), 27 deletions(-) diff --git a/chushang-common/chushang-common-excel/src/main/java/com/chushang/common/excel/utils/ExcelUtils.java b/chushang-common/chushang-common-excel/src/main/java/com/chushang/common/excel/utils/ExcelUtils.java index 8f4b707..6922cbd 100644 --- a/chushang-common/chushang-common-excel/src/main/java/com/chushang/common/excel/utils/ExcelUtils.java +++ b/chushang-common/chushang-common-excel/src/main/java/com/chushang/common/excel/utils/ExcelUtils.java @@ -1,22 +1,24 @@ package com.chushang.common.excel.utils; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.Assert; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.read.builder.ExcelReaderBuilder; import com.alibaba.excel.read.listener.ReadListener; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.chushang.common.core.exception.ResultException; import com.chushang.common.core.util.StringUtils; +import com.chushang.common.excel.convert.ExcelBigNumberConvert; import com.chushang.common.excel.listener.DataListener; import com.chushang.common.excel.listener.DefaultExcelListener; import com.chushang.common.excel.listener.ImportListener; import com.chushang.common.excel.service.ExcelImporter; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.List; @@ -26,6 +28,7 @@ import java.util.function.Consumer; * by zhaowenyuan create 2021/12/27 10:49 * 表格工具 */ +@Slf4j public class ExcelUtils { /** * 导出文件时为Writer生成OutputStream. @@ -51,13 +54,48 @@ public class ExcelUtils { @SneakyThrows public static void exportList(HttpServletResponse response, Class clazz, List list, String sheetName){ OutputStream outputStream = getOutputStream(response); - EasyExcel.write(outputStream, clazz) - .sheet(sheetName) - .doWrite(list); - - outputStream.close(); + exportList(outputStream, clazz, list, sheetName); } + @SneakyThrows + public static void exportList(OutputStream outputStream, Class clazz, List list, String sheetName){ + EasyExcel.write(outputStream, clazz) + // 自动适配 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + // 大数值自动转换 防止失真 + .registerConverter(new ExcelBigNumberConvert()) + .autoCloseStream(false) + .sheet(sheetName) + .doWrite(list); + } + public static File exportExcel(List list, Class clazz, String path) { + File file = FileUtil.touch(path); + try (OutputStream outputStream = FileUtil.getOutputStream(file)) { + exportList(outputStream, clazz, list, ""); + } catch (Exception e) { + log.error("#MerInfoServiceImpl.exportMer# :", e); + Assert.isTrue(Boolean.FALSE, "文件生成失败"); + } + return file; + } + /** + * 导出excel + * + * @param response 响应类 + * @param fileName 文件名 + * @param sheetName sheet名 + * @param dataList 数据列表 + * @param clazz class类 + * @param 泛型 + */ + @SneakyThrows + public static void exportList(HttpServletResponse response, String fileName, String sheetName, List dataList, Class clazz) { + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("UTF-8"); + fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8); + response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); + exportList(response, clazz, dataList, sheetName); + } /** * 使用校验监听器 异步导入 同步返回 @@ -165,24 +203,7 @@ public class ExcelUtils { public static void save(List rowList, ExcelImporter importer) { importer.save(rowList); } - /** - * 导出excel - * - * @param response 响应类 - * @param fileName 文件名 - * @param sheetName sheet名 - * @param dataList 数据列表 - * @param clazz class类 - * @param 泛型 - */ - @SneakyThrows - public static void exportList(HttpServletResponse response, String fileName, String sheetName, List dataList, Class clazz) { - response.setContentType("application/vnd.ms-excel"); - response.setCharacterEncoding("UTF-8"); - fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8); - response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); - exportList(response, clazz, dataList, sheetName); - } + public static ExcelReaderBuilder getReaderBuilder(InputStream inputStream, ReadListener readListener, Class clazz) { return EasyExcel.read(inputStream, clazz, readListener); diff --git a/chushang-modules/chushang-module-oss/oss-feign/src/main/java/com/chushang/oss/feign/RemoteOssService.java b/chushang-modules/chushang-module-oss/oss-feign/src/main/java/com/chushang/oss/feign/RemoteOssService.java index 8fa25d6..3ec899d 100644 --- a/chushang-modules/chushang-module-oss/oss-feign/src/main/java/com/chushang/oss/feign/RemoteOssService.java +++ b/chushang-modules/chushang-module-oss/oss-feign/src/main/java/com/chushang/oss/feign/RemoteOssService.java @@ -32,5 +32,20 @@ public interface RemoteOssService { @PostMapping(value = "/uploadqccode") Result uploadQcCode() throws Exception; + /** + * 通过 文件字节上传, + * 需要文件名称, 文件路径, + * 不需要 做ocr, 需要做 水印添加 + * @param bytes 字节 + * + */ + @PostMapping(value = "/upload/bytes") + Result> uploadFile(@RequestParam(value = "bytes") byte[] bytes, + @RequestParam(value = "fileName") String fileName, + @RequestParam(value = "sealFlag", required = false, defaultValue= "false") Boolean sealFlag, + @RequestParam(value = "formats", required = false) String formats, + @RequestParam(value = "fileType", required = false) String fileType, + @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + } diff --git a/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/remote/RemoteFileController.java b/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/remote/RemoteFileController.java index 160917e..cb234e0 100644 --- a/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/remote/RemoteFileController.java +++ b/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/remote/RemoteFileController.java @@ -44,6 +44,17 @@ public class RemoteFileController implements RemoteOssService { return Result.ok(fileSourceService.uploadQcCode()); } + /** + * 文件导出, 有可能是 excel, word, zip, 单图片等 + * @param bytes 字节 + */ + @Override + @SysLog(value = "feign文件", businessType = BusinessType.EXPORT) + @PostMapping(value = "/upload/bytes") + public Result> uploadFile(byte[] bytes, String fileName, Boolean sealFlag, String formats, String fileType, String source) + { + return Result.ok(fileSourceService.uploadFile(bytes, fileName, sealFlag, formats, fileType)); + } } diff --git a/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/service/FileSourceService.java b/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/service/FileSourceService.java index 2df39d5..437d3d9 100644 --- a/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/service/FileSourceService.java +++ b/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/service/FileSourceService.java @@ -41,6 +41,8 @@ import javax.servlet.http.HttpServletResponse; import java.io.*; import java.time.ZonedDateTime; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -253,4 +255,63 @@ public class FileSourceService save(fileSourceInfo); return upload; } + + public FileSourceVo addFile(byte[] bytes, String fileName, Boolean sealFlag, String formats, String fileType) + { + String ip = IPUtils.clientIp(ServletUtils.getRequest()); + String fid = generateFid(); + String fName = fileName; + Tika t = new Tika(); + String mimetype = null; + try { + mimetype = t.detect(bytes); + if (fName.indexOf(".") < 0) {//如果文件名字没有后缀 + String ext = MimeTypes.getDefaultMimeTypes().forName(mimetype).getExtension(); + fName += ext; + } + } catch (MimeTypeException e) { + log.error("文件后缀识别失败"); + } + FileSourceInfo info = new FileSourceInfo(); + try (ByteArrayInputStream in = new ByteArrayInputStream(bytes)){ + info.setFid(fid); + info.setName(fName); + // mimeType 还不是 后缀 类型 + info.setMimeType(mimetype); + // size 如何获取? + info.setSize((long) bytes.length); + String md5 = FileUtils.getMd5(in); + info.setMd5(md5); + String path = ossService.getPrefixPath(md5,fName); + // 不带https 的路径 + info.setPath(path); + info.setStorage(uploadConfig.getStorage()); + info.setUploadIp(ip); + // 上传到 oss 或者 minio + String realPath = ossService.upload(bytes, info, sealFlag, formats); + // 带https 的路径 + info.setRealPath(realPath); + info.setFileType(fileType); + info.setBucketName(uploadConfig.getBucketName()); + RMap map = redissonClient.getMap("OSS-Cache"); + map.put(fid, info); + // 入库 + save(info); + map.remove(info.getFid()); + } catch (Exception e) { + log.error("上传文件失败", e); + } + FileSourceVo vo = new FileSourceVo(); + vo.setFid(info.getFid()); + vo.setFilePath(info.getRealPath()); + vo.setName(fName); + vo.setSize(info.getSize()); + return vo; + } + + + + public List uploadFile(byte[] bytes, String fileName, Boolean sealFlag, String formats, String fileType) { + return Collections.singletonList(addFile(bytes, fileName, sealFlag, formats, fileType)); + } }