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<MinioFile> 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<MinioResponseDTO> commonUploadFile(String path, List<MultipartFile> files) {
|
log.info(files.toString());
|
if (StringUtils.isNotEmpty(path) && !path.endsWith("/")) {
|
path = path + "/";
|
} else {
|
path = Year.now().getValue() + "其它/";
|
}
|
|
List<MinioResponseDTO> 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<MinioFile> 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();
|
}
|
}
|
}
|
}
|