From e0ff6529b4364fdbf81d25f33e881118b147b3fa Mon Sep 17 00:00:00 2001
From: zf <1603559716@qq.com>
Date: 星期一, 31 七月 2023 13:04:41 +0800
Subject: [PATCH] bug修改

---
 src/main/java/com/gk/hotwork/Service/ServiceImpl/AttachmentServiceImpl.java |  327 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 327 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/gk/hotwork/Service/ServiceImpl/AttachmentServiceImpl.java b/src/main/java/com/gk/hotwork/Service/ServiceImpl/AttachmentServiceImpl.java
new file mode 100644
index 0000000..eeb77a0
--- /dev/null
+++ b/src/main/java/com/gk/hotwork/Service/ServiceImpl/AttachmentServiceImpl.java
@@ -0,0 +1,327 @@
+package com.gk.hotwork.Service.ServiceImpl;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.servlet.ServletUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.gk.hotwork.Config.attachment.FilePathConfig;
+import com.gk.hotwork.Domain.AttachmentInfo;
+import com.gk.hotwork.Domain.Enum.ResultCodes;
+import com.gk.hotwork.Domain.Exception.BusinessException;
+import com.gk.hotwork.Domain.UserInfo;
+import com.gk.hotwork.Domain.Utils.StringUtils;
+import com.gk.hotwork.Mapper.AttachmentInfoMapper;
+import com.gk.hotwork.Service.AttachmentInfoService;
+import com.gk.hotwork.Service.AttachmentService;
+import com.gk.hotwork.common.FileProjectConstants;
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+import static cn.hutool.core.io.FileTypeUtil.getType;
+
+/**
+ * @email 1603559716@qq.com
+ * @author: zf
+ * @date: 2023/7/24
+ * @time: 13:54
+ */
+@Service
+public class AttachmentServiceImpl implements AttachmentService {
+
+    @Autowired
+    private AttachmentInfoService attachmentInfoService;
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+    /**
+     * 错误信息格式
+     */
+    private static final String ERROR_FORMATTER = "{}:{}";
+
+    @Resource
+    private FilePathConfig filePathConfig;
+    @Override
+    public AttachmentInfo findByKey(String key) {
+        if (StringUtils.isBlank(key)){
+            throw new BusinessException("文件标识为空");
+        }
+        return attachmentInfoService.findByKey(key);
+    }
+    @Override
+    public AttachmentInfo findById(Long id) {
+        if (id == null){
+            throw new BusinessException("文件主键为空");
+        }
+        return attachmentInfoService.findById(id);
+    }
+    @Override
+    public List<AttachmentInfo> findByIds(List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)){
+            throw new BusinessException("文件主键为空");
+        }
+        return attachmentInfoService.findByIds(ids);
+    }
+    @Override
+    public List<AttachmentInfo> findByBusinessId(Long businessId) {
+        if (businessId == null){
+            throw new BusinessException("业务主键为空");
+        }
+        return attachmentInfoService.findByBusinessId(businessId);
+    }
+
+    @Override
+    public void delete(Long id, UserInfo userInfo) {
+        if (id == null){
+            throw new BusinessException("文件主键为空");
+        }
+        attachmentInfoService.delete(id,userInfo);
+    }
+
+    @Override
+    public Object saveFileToPath(MultipartFile file, String module, int type, UserInfo user) {
+        //获取对应模块路径
+        String path;
+        //获取对应模块根路径
+        String dcPath;
+        path = filePathConfig.getModule().get(module);
+        dcPath = filePathConfig.getDcPath();
+
+        String originalFilename = file.getOriginalFilename();
+        if (com.alibaba.druid.util.StringUtils.isEmpty(originalFilename)) {
+            logger.error(ERROR_FORMATTER,module, ResultCodes.PATH_NOT_EXISIST.getDesc());
+            throw new BusinessException(ResultCodes.FILE_NOT_EXISIST);
+        }
+        if (com.alibaba.druid.util.StringUtils.isEmpty(path)) {
+            logger.error(ERROR_FORMATTER, module, ResultCodes.PATH_NOT_EXISIST.getDesc());
+            throw new BusinessException(ResultCodes.PATH_NOT_EXISIST);
+        }
+        assert originalFilename != null;
+        LocalDateTime now = LocalDateTime.now();
+        File newFile = null;
+        try {
+            //文件标识 UUID 如4d6873609b144945935ae84442711fd6
+            String key = "";
+            String suffix = "";
+            if (originalFilename.contains(".mp3")) {
+                key = originalFilename;
+                suffix = "";
+            } else {
+                key = UUID.randomUUID().toString().replace("-", "");
+                //文件后缀  包含.
+                suffix = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
+            }
+
+            path = path.replace("/", File.separator);
+            //文件模块路径 如 2021/base/build/0421
+            String modulePath = now.getYear() + path + now.format(DateTimeFormatter.ofPattern("MMdd"));
+            //文件路径  如 2021/base/build/0421/4d6873609b144945935ae84442711fd6.后缀
+            String newFilePath = modulePath + File.separator + key + suffix;
+            //文件绝对路径 如 /home/img/2021/base/build/0421/4d6873609b144945935ae84442711fd6.后缀
+            String localPath = dcPath + newFilePath;
+            //文件访问路径 如 /upload/2021/base/build/0421/4d6873609b144945935ae84442711fd6.后缀
+            String url = filePathConfig.getUrlRootPath() + newFilePath.replace(File.separator, "/");
+            newFile = new File(localPath);
+            if (!newFile.exists() && !newFile.mkdirs()) {
+                logger.error(ERROR_FORMATTER, newFilePath, ResultCodes.FILE_UPLOAD_FAIL.getDesc());
+                throw new BusinessException(ResultCodes.FILE_UPLOAD_FAIL);
+            }
+            file.transferTo(newFile);
+            //创建文件信息
+            AttachmentInfo attachmentInfo = new AttachmentInfo();
+            attachmentInfo.setDelFlag(0);
+            attachmentInfo.setFileKey(key);
+            attachmentInfo.setFileSuffix(suffix);
+            attachmentInfo.setFilePath(localPath);
+            attachmentInfo.setFileUrl(url);
+            attachmentInfo.setFileName(file.getOriginalFilename());
+            attachmentInfo.setFileSize(file.getSize());
+            attachmentInfo.setModule(module);
+            attachmentInfo.setFileType(getType(suffix));
+            attachmentInfo.setCreateUid(user.getId());
+            attachmentInfo.setCreateUname(user.getRealname());
+            attachmentInfo.setUpdateUid(user.getId());
+            attachmentInfo.setUpdateUname(user.getRealname());
+            attachmentInfo.setUpdateTime(new Date());
+            attachmentInfo.setCreateTime(new Date());
+            AttachmentInfo attachment = attachmentInfoService.saveOne(attachmentInfo);
+            switch (type) {
+                case FileProjectConstants.ReturnType.URL:
+                    return url;
+                case FileProjectConstants.ReturnType.KEY:
+                    return key;
+                case FileProjectConstants.ReturnType.DETAIL:
+                    return attachment;
+                default:
+                    return null;
+            }
+        } catch (IOException e) {
+            if (newFile != null && newFile.exists()) {
+                newFile.delete();
+            }
+            logger.error(ERROR_FORMATTER, ResultCodes.FILE_UPLOAD_FAIL, e.getMessage());
+            throw new BusinessException(ResultCodes.FILE_UPLOAD_FAIL);
+        }
+    }
+
+    @Override
+    public Object saveBatchFileToPath(MultipartFile[] fileList, String module, UserInfo user) {
+        //获取对应模块路径
+        String path;
+        //获取对应模块根路径
+        String dcPath;
+        path = filePathConfig.getModule().get(module);
+        dcPath = filePathConfig.getDcPath();
+        List<AttachmentInfo> attachmentInfoList = new ArrayList<>();
+        for (MultipartFile file : fileList) {
+            String originalFilename = file.getOriginalFilename();
+            if (com.alibaba.druid.util.StringUtils.isEmpty(originalFilename)) {
+                logger.error(ERROR_FORMATTER,module, ResultCodes.PATH_NOT_EXISIST.getDesc());
+                throw new BusinessException(ResultCodes.FILE_NOT_EXISIST);
+            }
+            if (com.alibaba.druid.util.StringUtils.isEmpty(path)) {
+                logger.error(ERROR_FORMATTER, module, ResultCodes.PATH_NOT_EXISIST.getDesc());
+                throw new BusinessException(ResultCodes.PATH_NOT_EXISIST);
+            }
+            assert originalFilename != null;
+            LocalDateTime now = LocalDateTime.now();
+            File newFile = null;
+            try {
+                //文件标识 UUID 如4d6873609b144945935ae84442711fd6
+                String key = "";
+                String suffix = "";
+                if (originalFilename.contains(".mp3")) {
+                    key = originalFilename;
+                    suffix = "";
+                } else {
+                    key = UUID.randomUUID().toString().replace("-", "");
+                    //文件后缀  包含.
+                    suffix = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
+                }
+
+                path = path.replace("/", File.separator);
+                //文件模块路径 如 2021/base/build/0421
+                String modulePath = now.getYear() + path + now.format(DateTimeFormatter.ofPattern("MMdd"));
+                //文件路径  如 2021/base/build/0421/4d6873609b144945935ae84442711fd6.后缀
+                String newFilePath = modulePath + File.separator + key + suffix;
+                //文件绝对路径 如 /home/img/2021/base/build/0421/4d6873609b144945935ae84442711fd6.后缀
+                String localPath = dcPath + newFilePath;
+                //文件访问路径 如 /upload/2021/base/build/0421/4d6873609b144945935ae84442711fd6.后缀
+                String url = filePathConfig.getUrlRootPath() + newFilePath.replace(File.separator, "/");
+                newFile = new File(localPath);
+                if (!newFile.exists() && !newFile.mkdirs()) {
+                    logger.error(ERROR_FORMATTER, newFilePath, ResultCodes.FILE_UPLOAD_FAIL.getDesc());
+                    throw new BusinessException(ResultCodes.FILE_UPLOAD_FAIL);
+                }
+                //上传文件
+                file.transferTo(newFile);
+                //创建文件信息
+                AttachmentInfo attachmentInfo = new AttachmentInfo();
+                attachmentInfo.setDelFlag(0);
+                attachmentInfo.setFileKey(key);
+                attachmentInfo.setFileSuffix(suffix);
+                attachmentInfo.setFilePath(localPath);
+                attachmentInfo.setFileUrl(url);
+                attachmentInfo.setFileName(file.getOriginalFilename());
+                attachmentInfo.setFileSize(file.getSize());
+                attachmentInfo.setModule(module);
+                attachmentInfo.setFileType(getType(suffix));
+                attachmentInfo.setCreateUid(user.getId());
+                attachmentInfo.setCreateUname(user.getRealname());
+                attachmentInfo.setUpdateUid(user.getId());
+                attachmentInfo.setUpdateUname(user.getRealname());
+                attachmentInfo.setUpdateTime(new Date());
+                attachmentInfo.setCreateTime(new Date());
+                attachmentInfoList.add(attachmentInfo);
+
+            } catch (IOException e) {
+                if (newFile != null && newFile.exists()) {
+                    newFile.delete();
+                }
+                logger.error(ERROR_FORMATTER, ResultCodes.FILE_UPLOAD_FAIL, e.getMessage());
+                throw new BusinessException(ResultCodes.FILE_UPLOAD_FAIL);
+            }
+        }
+        List<AttachmentInfo> detailList = attachmentInfoService.saveBatchAttachment(attachmentInfoList);
+
+        return detailList;
+    }
+
+    @Override
+    public void downloadForStream(HttpServletResponse response, String key) {
+        AttachmentInfo byKey = findByKey(key);
+        File file;
+        try {
+            response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(byKey.getFileName(), StandardCharsets.UTF_8.name()));
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+            file = new File(byKey.getFilePath());
+            if (!file.exists()) {
+                logger.error(ERROR_FORMATTER, key, ResultCodes.FILE_NOT_EXISIST.getDesc());
+                throw new BusinessException(ResultCodes.FILE_NOT_EXISIST);
+            }
+            OutputStream outputStream = response.getOutputStream();
+            FileInputStream inputStream = new FileInputStream(file);
+            IoUtil.copy(inputStream, outputStream);
+            outputStream.close();
+        } catch (IOException e) {
+            logger.error(e.getMessage());
+            throw new BusinessException(ResultCodes.FILE_DOWNLOAD_EXPERTION);
+        }
+    }
+    @Override
+    public void downloadById(HttpServletResponse response, HttpServletRequest request, Long id) {
+        Assert.isTrue(id == null, "文件key未知异常");
+        AttachmentInfo byId = findById(id);
+        downloadByEntity(response, request, byId);
+    }
+
+
+    public void downloadByEntity(HttpServletResponse response, HttpServletRequest request, AttachmentInfo attachmentInfo) {
+        if (ObjectUtil.isNotNull(attachmentInfo)) {
+            String type = attachmentInfo.getFileType();
+            if (StrUtil.isBlank(type)) {
+                type = "application/octet-stream";
+            }
+            type = type + ";charset=utf-8";
+            String fileName = attachmentInfo.getFileName();
+            response.setContentType("multipart/form-data;charset=utf-8");
+            ServletUtil.setHeader(response, "Access-Control-Expose-Headers", "Content-Disposition");
+            //本地文件下载
+            File file = FileUtil.file(attachmentInfo.getFilePath());
+            if (!FileUtil.exist(file)) {
+                throw new BusinessException(attachmentInfo.getFileKey() + "文件不存在");
+            }
+            InputStream is = null;
+            try {
+                is = IoUtil.toStream(file);
+                ServletUtil.write(response, is, type, fileName);
+            } catch (Exception e) {
+                throw new BusinessException(ResultCodes.FILE_DOWNLOAD_EXPERTION);
+            } finally {
+                IoUtil.close(is);
+            }
+        } else {
+            throw new BusinessException(ResultCodes.FILE_NOT_EXISIST);
+        }
+    }
+}

--
Gitblit v1.9.2