package com.smartor.service.impl; import cn.hutool.core.io.FileUtil; import com.ruoyi.common.config.MinioConfig; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.MinioClientUtils; import com.ruoyi.common.utils.StringUtils; import com.smartor.domain.MinioFile; import com.smartor.domain.MinioResponseDTO; import com.smartor.domain.TreeNode; import com.smartor.mapper.MinioFileMapper; import com.smartor.service.IMinioFileService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.time.Instant; import java.time.Year; import java.util.ArrayList; import java.util.List; /** * 【请填写功能名称】Service业务层处理 * * @author ruoyi * @date 2023-06-19 */ @Slf4j @Service public class MinioFileServiceImpl implements IMinioFileService { @Autowired private MinioFileMapper minioFileMapper; @Resource private MinioClientUtils minioClientUtils; @Resource private MinioConfig minioConfig; /** * 查询【请填写功能名称】 * * @param id 【请填写功能名称】主键 * @return 【请填写功能名称】 */ @Override public MinioFile selectMinioFileById(Long id) { return minioFileMapper.selectMinioFileById(id); } /** * 查询【请填写功能名称】列表 * * @param minioFile 【请填写功能名称】 * @return 【请填写功能名称】 */ @Override public List selectMinioFileList(MinioFile minioFile) { return minioFileMapper.selectMinioFileList(minioFile); } /** * 新增【请填写功能名称】 * * @param minioFile 【请填写功能名称】 * @return 结果 */ @Override public int insertMinioFile(MinioFile minioFile) { minioFile.setCreateTime(DateUtils.getNowDate()); return minioFileMapper.insertMinioFile(minioFile); } /** * 修改【请填写功能名称】 * * @param minioFile 【请填写功能名称】 * @return 结果 */ @Override public int updateMinioFile(MinioFile minioFile) { minioFile.setUpdateTime(DateUtils.getNowDate()); return minioFileMapper.updateMinioFile(minioFile); } /** * 批量删除【请填写功能名称】 * * @param ids 需要删除的【请填写功能名称】主键 * @return 结果 */ @Override public int deleteMinioFileByIds(Long[] ids) { return minioFileMapper.deleteMinioFileByIds(ids); } /** * 删除【请填写功能名称】信息 * * @param id 【请填写功能名称】主键 * @return 结果 */ @Override public int deleteMinioFileById(Long id) { return minioFileMapper.deleteMinioFileById(id); } @Override public List commonUploadFile(String path, List files) { log.info(files.toString()); if (StringUtils.isNotEmpty(path) && !path.endsWith("/")) { path = path + "/"; } else { path = Year.now().getValue() + "其它/"; } List MinioResponseDTOList = new ArrayList<>(); for (MultipartFile file : files) { String originalFilename = file.getOriginalFilename(); // 获取文件拓展名 String extName = FileUtil.extName(originalFilename); log.info("文件拓展名:" + extName); // 生成新的文件名,存入到minio long millSeconds = Instant.now().toEpochMilli(); String minioFileName = millSeconds + RandomStringUtils.randomNumeric(12) + "." + extName; String contentType = file.getContentType(); log.info("文件mime:{}", contentType); // 返回文件大小,单位字节 long size = file.getSize(); log.info("文件大小:" + size); try { String bucketName = minioConfig.getBucketName(); minioClientUtils.putObject(bucketName, file, path + originalFilename); // String fileUrl = minioClientUtils.getObjectUrl(bucketName, path + originalFilename); // String fileUrl = path + originalFilename; //url可以使用一周 String fileUrl = getFileUrl(path + originalFilename, 6); MinioFile minioFile = new MinioFile(); minioFile.setOriginalFileName(originalFilename); minioFile.setFileExtName(extName); minioFile.setFileName(originalFilename); minioFile.setFileSize(size); minioFile.setMime(contentType); minioFile.setIsDelete(NumberUtils.INTEGER_ZERO); minioFile.setFileUrl(fileUrl); int i = insertMinioFile(minioFile); if (i > 0) { MinioResponseDTO minioResponseDTO = new MinioResponseDTO(); minioResponseDTO.setFileId(minioFile.getId()); minioResponseDTO.setOriginalFileName(originalFilename); minioResponseDTO.setFileUrl(fileUrl); MinioResponseDTOList.add(minioResponseDTO); } } catch (Exception e) { log.error("上传文件出错:{}", e); } } return MinioResponseDTOList; } @Override public TreeNode getEduTemplage() { List minioFiles = minioFileMapper.selectMinioFileList(null); TreeNode root = new TreeNode(""); // 使用递归将列表转成树开结构 for (MinioFile minioFile1 : minioFiles) { String[] parts = minioFile1.getFileUrl().split("/"); TreeNode current = root; for (String part : parts) { if (!part.isEmpty()) { TreeNode child = findChild(current, part); if (child == null) { child = new TreeNode(part); current.addChild(child); } current = child; } } } return root; } @Override public void downloadFile(HttpServletResponse response, String fileName) { InputStream object = null; try { object = minioClientUtils.getObject(minioConfig.getBucketName(), fileName); writeFile(response, object); } catch (Exception e) { log.info("文件下载,报错了!!!{}", fileName); e.printStackTrace(); } } @Override public String getFileUrl(String fileName, Integer expires) { String presignedObjectUrl = null; try { presignedObjectUrl = minioClientUtils.getPresignedObjectUrl(minioConfig.getBucketName(), fileName, expires); //去掉url里?后面的请求信息 presignedObjectUrl = presignedObjectUrl.substring(0, presignedObjectUrl.lastIndexOf("?")); } catch (Exception e) { log.info("文件下载,报错了!!!{}, {}", fileName, expires); e.printStackTrace(); } return presignedObjectUrl; } private TreeNode findChild(TreeNode parent, String name) { for (TreeNode child : parent.getChildren()) { if (child.getName().equals(name)) { return child; } } return null; } public void writeFile(HttpServletResponse resp, InputStream inputStream) { OutputStream out = null; try { out = resp.getOutputStream(); int len = 0; byte[] b = new byte[1024]; while ((len = inputStream.read(b)) != -1) { out.write(b, 0, len); } out.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (out != null) { out.close(); } } catch (Exception e) { e.printStackTrace(); } } } }