package com.sandu.common.file.impl; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.UUID; import com.sandu.common.enums.FileStorageEnums; import com.sandu.common.execption.BusinessException; import com.sandu.common.file.FileUploadDto; import com.sandu.common.file.IFileUpload; import com.sandu.common.file.config.minioConfig.MinIoPolicy; import io.minio.*; import io.minio.messages.Bucket; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import java.math.BigInteger; import java.security.MessageDigest; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; /** * @author chenjiantian * @date 2020/12/17 15:31 */ @Slf4j @Component public class AliOssFileServiceImpl implements IFileUpload { @Autowired private MinioClient minioClient; private String bucketName = "remote-update"; public String MINIO_PREFIX = "vnnox."; @Override public FileUploadDto uploadFile(MultipartFile multipartFile) { String originalFilename = multipartFile.getOriginalFilename(); long size = multipartFile.getSize(); String suffix = FileUtil.getSuffix(originalFilename); String dayStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")); String fileName = dayStr + UUID.fastUUID() + "." + suffix; String md5 = getMD5(multipartFile); FileUploadDto uploadDto = new FileUploadDto(); try { if (!bucketExists(bucketName)) { createBucket(bucketName); if (bucketName.contains(MINIO_PREFIX)) { setBucketPolicy(bucketName); } } final InputStream is = multipartFile.getInputStream(); Long start = System.currentTimeMillis(); minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1)); is.close(); System.out.println(("上传总时间:" + (System.currentTimeMillis() - start) + "ms")); // 从minio获取 url String url = minioClient.presignedGetObject(bucketName, fileName); System.out.println("获取到的路径:"+url); uploadDto.setFileUrl(url); } catch (Exception e) { log.error(e.getMessage(), e); throw new BusinessException(e.getMessage()); } uploadDto.setOriginName(originalFilename); uploadDto.setFileName(fileName); uploadDto.setFileType(FileUtil.extName(originalFilename)); uploadDto.setStorageType(FileStorageEnums.ALIBABA.getCode()); uploadDto.setFileSize(size); uploadDto.setMd5(md5); if (IMAGE_SUFFIX_LIST.contains(uploadDto.getFileType())) { BufferedImage img = null; try { img = ImageIO.read(multipartFile.getInputStream()); } catch (IOException e) { e.printStackTrace(); } if (img != null && img.getWidth() >= 0 && img.getHeight() >= 0) { uploadDto.setWidth(img.getWidth()); uploadDto.setHeight(img.getHeight()); } } return uploadDto; } /** * 获取上传文件的MD5值 * * @param file * @return */ public String getMD5(MultipartFile file) { try { byte[] uploadBytes = file.getBytes(); MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] digest = md5.digest(uploadBytes); String hashString = new BigInteger(1, digest).toString(16); if (hashString.length() % 2 != 0) { hashString = "0" + hashString; } return hashString; } catch (Exception e) { } return null; } /** * 设置开放*的桶策略 * * @param bucketName * @return */ public void setBucketPolicy(String bucketName) throws Exception { minioClient.setBucketPolicy( SetBucketPolicyArgs.builder().bucket(bucketName).config(MinIoPolicy.generateMinioPolicy(bucketName)).build() ); } /** * 判断 bucket是否存在 * * @param bucketName: 桶名 * @return: boolean */ @SneakyThrows(Exception.class) public boolean bucketExists(String bucketName) { return minioClient.bucketExists(bucketName); } public boolean objectExists(String bucketName, String objectName) { try { getObjectInfo(bucketName, objectName); } catch (Exception e) { return false; } return true; } private void getObjectInfo(String bucketName, String objectName) { } /** * 创建 bucket * * @param bucketName: 桶名 * @return: void */ @SneakyThrows(Exception.class) public void createBucket(String bucketName) { boolean isExist = minioClient.bucketExists((BucketExistsArgs) ((io.minio.BucketExistsArgs.Builder) BucketExistsArgs.builder().bucket(bucketName)).build()); if (!isExist) { minioClient.makeBucket((MakeBucketArgs) ((io.minio.MakeBucketArgs.Builder) MakeBucketArgs.builder().bucket(bucketName)).build()); } } /** * 获取全部bucket */ @SneakyThrows(Exception.class) public List getAllBuckets() { return minioClient.listBuckets(); } }