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