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<Bucket> getAllBuckets() {
|
return minioClient.listBuckets();
|
}
|
|
}
|