1.MinioConfig配置类
@Configuration @ConfigurationProperties(prefix = "minio") @Data public class MinioConfig { /** * minio部署的机器ip地址 */ @Value("${minio.endpoint}") private String endpoint; /** * minio使用的端口 */ @Value("${minio.port}") private Integer port; /** *唯一标识的账户 */ @Value("${minio.accessKey}") private String accessKey; /** * 账户的密码 */ @Value("${minio.secretKey}") private String secretKey; /** * 如果是true,则用的是https而不是http,默认值是true */ @Value("${minio.secure}") private Boolean secure; /** * 默认使用的桶名称 */ @Value("${minio.bucketName}") private String defaultBucketName; /** * 对象交给spring管理 */ @Bean public MinioClient getMinioClient() { MinioClient minioClient = MinioClient.builder() .endpoint(endpoint , port , secure) .credentials(accessKey, secretKey) .build(); return minioClient; } }
2.MinioUtil工具类
@Component @Slf4j public class MinioUtil { @Autowired private MinioClient minioClient; /** * 获取当前日期字符串格式 * @return 2021/12/5 */ public String getDatePath() { LocalDateTime now = LocalDateTime.now(); return String.format("/%s/%s/%s/", now.getYear(), now.getMonthValue(), now.getDayOfMonth()); } /** * 判断桶是否存 * @param bucketName 桶名称 * @return */ public boolean bucketExists(String bucketName) throws Exception { boolean flag = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); if (flag) { return true; } return false; } /** * 创建桶 */ public boolean createBucket(String bucketName) { try { //判断文件存储的桶对象是否存在 boolean isExist = bucketExists(bucketName); if (isExist) { log.info("Bucket asiatrip already exists."); return false; } else { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); return true; } } catch (Exception e) { log.error("errorMsg={}",e); return false; } } /** * 列出桶里的所有对象 * @param bucketName 桶名称 */ public Iterable> listObjects(String bucketName) { return minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build()); } /** * 删除桶 * @param bucketName 桶名称 * @return 是否删除成功 */ public boolean removeBucket(String bucketName) { try { boolean flag = bucketExists(bucketName); if (flag) { Iterable > myObjects = listObjects(bucketName); for (Result - result : myObjects) { Item item = result.get(); // 有对象文件,则删除失败 if (item.size() > 0) { return false; } } // 删除存储桶,注意,只有存储桶为空时才能删除成功。 minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); flag = bucketExists(bucketName); if (!flag) { return true; } } } catch (Exception e) { log.error("errorMsg={}",e); return false; } return false; } /** * 获取所有桶信息 */ public List
getAllBucket() { try { // 获取minio中所以的bucket List buckets = minioClient.listBuckets(); for (Bucket bucket : buckets) { log.info("bucket 名称: {} bucket 创建时间: {}", bucket.name(), bucket.creationDate()); } return buckets; } catch (Exception e) { log.error("errorMsg={}",e); return Collections.emptyList(); } } /** * 上传本地文件到指定桶下 * @param bucketName 桶名称 * @param objectName 对象名称 * @param localFileName 要上传的文件路径 * @return */ public boolean upload(String bucketName, String objectName, String localFileName) { try { File file = new File(localFileName); FileInputStream fileInputStream = new FileInputStream(file); minioClient.putObject(PutObjectArgs.builder() .stream(fileInputStream, file.length(), PutObjectArgs.MIN_MULTIPART_SIZE) .bucket(bucketName) .object(objectName) .build()); return true; } catch (Exception e) { log.error("errorMsg={}",e); return false; } } /** * 上传MultipartFile到指定桶下 * @param bucketName 桶名称 * @param objectName 对象名称 * @param file 文件流 */ public boolean upload(String bucketName, String objectName, MultipartFile file) { try { minioClient.putObject(PutObjectArgs.builder() .bucket(bucketName) .stream(file.getInputStream(), file.getSize(), PutObjectArgs.MIN_MULTIPART_SIZE) .object(objectName) .build()); return true; } catch (Exception e) { log.error("errorMsg={}",e); return false; } } /** * 下载文件到本地 * @param bucketName 桶名称 * @param objectName 对象名称 * @param localFileName 本地文件存储路径 */ public boolean downLocal(String bucketName, String objectName, String localFileName) { try { minioClient.downloadObject(DownloadObjectArgs.builder() .bucket(bucketName) .object(objectName) .filename(localFileName) .build()); return true; } catch (Exception e) { log.error("errorMsg={}",e); return false; } } /** * 下载文件写入到HttpServletResponse * @param bucketName 桶名称 * @param objectName 对象名称 * @param response HttpServletResponse对象 */ @SneakyThrows public void downResponse(String bucketName, String objectName, HttpServletResponse response) { GetObjectResponse object = minioClient.getObject(GetObjectArgs.builder() .bucket(bucketName) .object(objectName) .build()); response.setHeader("Content-Disposition", "attachment;filename=" + objectName.substring(objectName.lastIndexOf("/") + 1)); response.setContentType("application/force-download"); response.setCharacterEncoding("UTF-8"); IOUtils.copy(object, response.getOutputStream()); } /** * 删除指定桶的指定文件对象 * @param bucketName 桶名称 * @param objectName 对象名称 */ public boolean delete(String bucketName, String objectName) { try { minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build()); return true; }catch (Exception e){ log.error("errorMsg={}",e); return false; } } /** * 删除指定桶的多个文件对象,返回删除错误的对象列表,全部删除成功,返回空列表 * @param bucketName 存储桶名称 * @param objectNames 含有要删除的多个object名称的迭代器对象 * @return */ public boolean deletes(String bucketName, List objectNames) { try { List deleteErrorNames = new ArrayList<>(); List list = new LinkedList<>(); objectNames.forEach(item -> list.add(new DeleteObject(item))); Iterable > results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(list).build()); for (Result result : results) { DeleteError error = result.get(); deleteErrorNames.add(error.objectName()); } return deleteErrorNames.size() == 0 ? true : false; } catch (Exception e) { log.error("errorMsg={}",e); return false; } } /** * 获取文件带时效的访问链接 失效时间(以秒为单位),默认是7天不得大于七天 * @param bucketName 桶名称 * @param remoteFileName 对象名称 * @param timeout 时间 * @param unit 单位 * @return 文件访问链接 */ public String getPresignedObjectUrl(String bucketName, String remoteFileName, long timeout, TimeUnit unit) { try { return minioClient.getPresignedObjectUrl( GetPresignedObjectUrlArgs.builder() .method(Method.GET) .bucket(bucketName) .object(remoteFileName) .expiry((int) unit.toSeconds(timeout)) .build()); } catch (Exception e) { log.error("errorMsg={}",e); return null; } } /** * 预览 * @param fileName * @return */ public String preview(String fileName,String bucketName){ // 查看文件地址 GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket(bucketName).object(fileName).method(Method.GET).build(); try { String url = minioClient.getPresignedObjectUrl(build); return url; } catch (Exception e) { e.printStackTrace(); } return null; } }
3.对应使用方法
public class SysFileServiceImpl extends ServiceImplimplements SysFileService { @Resource private MinioConfig minioConfig; @Autowired private MinioUtil minioUtil; @Resource SysFileMapper sysFileMapper; @Override public HashMap uploadFile(MultipartFile file) { //上传minio String bucketName = minioConfig.getDefaultBucketName(); //桶 String fileCode = IdUtil.simpleUUID(); String fileName = file.getOriginalFilename(); //文件名称 String fileUrl = minioUtil.getDatePath() + fileCode + "_"+fileName; //文件存放路径 minioUtil.upload(bucketName, fileUrl, file); //保存文件 SysFile sysFile = new SysFile(); sysFile.setName(fileName); sysFile.setUrl(fileUrl); sysFileMapper.insert(sysFile); //返回数据 HashMap objectInfo = new HashMap<>(); objectInfo.put("fileName", fileName); //只能预览图片、txt等部分文件 String viewPath = minioUtil.getPresignedObjectUrl(bucketName, fileUrl, 1, TimeUnit.DAYS); objectInfo.put("viewPath", viewPath); objectInfo.put("fileId", String.valueOf(sysFile.getId())); return objectInfo; } @Override public String getFileUrl(String fieldId) { String bucketName = minioConfig.getDefaultBucketName(); SysFile sysFile = sysFileMapper.selectById(fieldId); return minioUtil.preview(sysFile.getUrl(),bucketName); } }