package com.cloudroam.manager.impl; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.cloudroam.common.LocalUser; import com.cloudroam.common.enumeration.DeletedEnum; import com.cloudroam.manager.SysFileManager; import com.cloudroam.model.SysFileDO; import com.cloudroam.model.UserDO; import com.cloudroam.module.file.FileTypeEnum; import com.cloudroam.module.file.FileUtil; import com.cloudroam.service.SysFileService; import com.cloudroam.util.DateUtils; import com.cloudroam.util.MinioUtil; import org.apache.tomcat.util.http.fileupload.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.net.URLEncoder; import java.util.Date; @Service public class SysFileManagerImpl implements SysFileManager { @Autowired private MinioUtil minioUtil; @Autowired private SysFileService sysFileService; @Override @Transactional public SysFileDO uploadFile(MultipartFile uploadfile, String bucket, String objectName) throws Exception { // 目录 String catalog=objectName; String folder=objectName+DateUtils.getCurrentDateCatalog(); // 原来文件 String originalFilename=uploadfile.getOriginalFilename(); // 拓展名 String ext = FileUtil.getFileExt(originalFilename); // 新文件名 String newFileName=FileUtil.getNewFilename(ext); // 文件的MD5,如果md5一样的话,则说明是重复性文件 String md5=FileUtil.getFileMD5(uploadfile.getBytes()); // 不加bucket的文件路径 String path=folder+ newFileName; // 文件的完整路径 String fullpath=bucket+"/"+folder+ newFileName; String uploadObjectName=folder+ newFileName; long fileSize=uploadfile.getSize(); // 不管有没有bucket都执行创建bucket命令 minioUtil.createBucket(bucket); minioUtil.uploadFile(uploadfile.getInputStream(), bucket, path); UserDO userDO= LocalUser.getLocalUser(); SysFileDO sysFileDO=new SysFileDO(); sysFileDO.setId(IdUtil.simpleUUID()); sysFileDO.setBucket(bucket); sysFileDO.setCatalog(catalog); sysFileDO.setFolder(folder); sysFileDO.setPath(path); sysFileDO.setFullpath(fullpath); sysFileDO.setType(FileTypeEnum.REMOTE.getValue()); sysFileDO.setName(originalFilename); sysFileDO.setExtension(ext); sysFileDO.setSize(fileSize); sysFileDO.setMd5(md5); // sysFileDO.setCreateUserId(String.valueOf(userDO.getId())); // sysFileDO.setCreateUserName(userDO.getNickname()); sysFileDO.setCreateTime(new Date()); // sysFileDO.setUpdateUserId(String.valueOf(userDO.getId())); // sysFileDO.setUpdateUserName(userDO.getNickname()); sysFileDO.setUpdateTime(new Date()); sysFileDO.setIsDeleted(DeletedEnum.DELETED_NO.getCode()); // 信息入库 sysFileService.save(sysFileDO); // 信息返回 return sysFileService.getById(sysFileDO.getId()); } @Override public SysFileDO getFileByFullpath(String fullpath) { QueryWrapper queryWrapper=new QueryWrapper<>(); queryWrapper.eq("is_deleted",DeletedEnum.DELETED_NO.getCode()); queryWrapper.eq("fullpath",fullpath); return sysFileService.getOne(queryWrapper); } @Override public void downloadFileWithFullpath(String fullpath, HttpServletResponse response) throws Exception { SysFileDO fileDO = getFileByFullpath(fullpath); String bucket=fullpath.substring(0,fullpath.indexOf("/")); String objectName=fullpath.substring(fullpath.indexOf("/")); InputStream stream = minioUtil.download(bucket, objectName); ServletOutputStream output = response.getOutputStream(); // response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(objectName.substring(objectName.lastIndexOf("/") + 1), "UTF-8")); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileDO.getName(), "UTF-8")); response.setContentType("application/octet-stream"); response.setCharacterEncoding("UTF-8"); IOUtils.copy(stream, output); } }