minio压缩上传图片

676 阅读3分钟

1、pom依赖

<!--minio-->
<dependency>  
    <groupId>io.minio</groupId>  
    <artifactId>minio</artifactId>  
    <version>7.1.2</version>  
</dependency>


<!--图片压缩-->
<dependency>  
    <groupId>net.coobird</groupId>  
    <artifactId>thumbnailator</artifactId>  
    <version>0.4.8</version>  
</dependency>

<!-- 工具类依赖 -->  
<dependency>  
    <groupId>org.apache.commons</groupId>  
    <artifactId>commons-lang3</artifactId>  
    <version>3.12.0</version>  
</dependency>

2、代码

properties


package org.zy.zbp.boot.config.properties;  
  
import lombok.Data;  
import org.springframework.boot.context.properties.ConfigurationProperties;  
import org.springframework.stereotype.Component;  
  
/**  
* @author xulongyu  
*/  
@ConfigurationProperties(prefix = "minio")  
@Component  
@Data  
public class MinioProperties {  
  
/**  
* 连接地址  
*/  
private String endpoint;  
/**  
* 用户名  
*/  
private String accessKey;  
/**  
* 密码  
*/  
private String secretKey;  
/**  
* 域名  
*/  
private String nginxHost;  
  
/**  
* 桶  
*/  
private String bucketName;  
  
  
}

2、注册bean

package org.zy.zbp.boot.config.bean;  
  
import io.minio.MinioClient;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.boot.context.properties.EnableConfigurationProperties;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.zy.zbp.boot.config.properties.MinioProperties;  
  
/**  
* @author xulongyu  
*/  
@Configuration  
@EnableConfigurationProperties(MinioProperties.class)  
public class MinioConfig {  
  
@Autowired  
private MinioProperties minioProperties;  
  
@Bean  
public MinioClient minioClient() {  
return MinioClient.builder()  
        .endpoint(minioProperties.getEndpoint())  
        .credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey())  
        .build();  
    }  
}

3、MinioUtil


package org.zy.zbp.boot.config.utils;  
  
import cn.hutool.core.date.DateUtil;  
import io.minio.*;  
import io.minio.messages.Bucket;  
import lombok.AllArgsConstructor;  
import lombok.extern.slf4j.Slf4j;  
import net.coobird.thumbnailator.Thumbnails;  
import org.apache.commons.fileupload.FileItem;  
import org.apache.commons.fileupload.FileItemFactory;  
import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
import org.apache.velocity.shaded.commons.io.FilenameUtils;  
import org.springframework.stereotype.Component;  
import org.springframework.web.multipart.MultipartFile;  
import org.springframework.web.multipart.commons.CommonsMultipartFile;  
import org.zy.zbp.boot.config.exception.BizAssert;  
import org.zy.zbp.boot.config.properties.MinioProperties;  
import org.zy.zbp.boot.model.vo.UploadFileVO;  
  
import javax.imageio.ImageIO;  
import java.awt.*;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.time.LocalDate;  
import java.time.format.DateTimeFormatter;  
import java.util.List;  
import java.util.*;  
  
/**  
* @author lijianji  
* @ClassName MinioUtil  
* @Description Minio工具类  
* @createTime 2022-04-18  
*/  
@Component  
@Slf4j  
@AllArgsConstructor  
public class MinioUtil {  
  
private final MinioProperties minioProperties;  
  
private final MinioClient minioClient;  
  
private final Long maxSize = (long) (1024 * 1024);  
  
/**  
* 创建bucket  
*/  
public void createBucket(String bucketName) throws Exception {  
    if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {  
        minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());  
    }  
}  
  
/**  
* 通过读取文件并获取其width及height的方式,来判断判断当前文件是否图片,这是一种非常简单的方式。  
*  
* @param imageFile  
* @return  
*/  
public static boolean isImage(MultipartFile imageFile) throws IOException {  
Image img = ImageIO.read(imageFile.getInputStream());  
if (img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) {  
    return false;  
}  
    return true;  
}  
  
/**  
* 上传图片  
*/  
public UploadFileVO uploadFile(MultipartFile file) throws Exception {  
BizAssert.isTrue(isImage(file), "非图片格式!!");  
String bucketName = minioProperties.getBucketName();  
//判断文件是否为空  
if (null == file || 0 == file.getSize()) {  
return null;  
}  
//判断存储桶是否存在 不存在则创建  
createBucket(bucketName);  
//文件名  
String fileName = file.getOriginalFilename();  
//生成文件名  
String fileSuffix = FilenameUtils.getExtension(fileName);  
String uniqueFileName = getUniqueFileName(fileSuffix);  
// 功能点/年/月/日/file  
String path = getPath("ZSTU-BIG-SCREEN", uniqueFileName);  
  
//开始上传  
log.info("file压缩前大小:{}",file.getSize());  
if (file.getSize() > maxSize) {  
FileItemFactory fileItemFactory = new DiskFileItemFactory();  
FileItem fileItem = fileItemFactory.createItem(fileName, "text/plain", true, fileName);  
OutputStream outputStream = fileItem.getOutputStream();  
Thumbnails.of(file.getInputStream()).scale(1f)  
.outputFormat(fileSuffix)  
.outputQuality(0.25f).toOutputStream(outputStream);  
file = new CommonsMultipartFile(fileItem);  
}  
log.info("file压缩后大小:{}",file.getSize());  
  
minioClient.putObject(  
PutObjectArgs.builder()  
.stream(file.getInputStream(), file.getSize(), -1)  
.bucket(bucketName)  
.object(path)  
.contentType(file.getContentType())  
.build());  
String url = minioProperties.getEndpoint() + "/" + bucketName + "/" + path;  
String urlHost = minioProperties.getNginxHost() + "/" + bucketName + "/" + path;  
return new UploadFileVO(url, urlHost);  
}  
  
  
private String getUniqueFileName(String fileSuffix) {  
return new StringJoiner(StrPool.DOT)  
.add(UUID.randomUUID().toString().replace("-", ""))  
.add(fileSuffix).toString();  
}  
  
/**  
* 年/月/日/业务类型/唯一文件名  
*/  
private String getPath(String bizType, String uniqueFileName) {  
    return new StringJoiner(StrPool.SLASH)  
        .add(bizType)
        .add(getDateFolder())
        .add(uniqueFileName)
        .toString();  
}  
  
/**  
* 获取年月日 2020/09/01  
*  
* @return  
*/  
private String getDateFolder() {  
return LocalDate.now().format(DateTimeFormatter.ofPattern(DateUtils.SLASH_DATE_FORMAT));  
}  
  
/**  
* 获取全部bucket  
*  
* @return  
*/  
public List<Bucket> getAllBuckets() throws Exception {  
return minioClient.listBuckets();  
}  
  
/**  
* 根据bucketName获取信息  
*  
* @param bucketName bucket名称  
*/  
public Optional<Bucket> getBucket(String bucketName) throws Exception {  
return minioClient.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst();  
}  
  
/**  
* 根据bucketName删除信息  
*  
* @param bucketName bucket名称  
*/  
public void removeBucket(String bucketName) throws Exception {  
minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());  
}  
  
/**  
* 获取⽂件外链  
*  
* @param bucketName bucket名称  
* @param objectName ⽂件名称  
* @param expires 过期时间 <=7  
* @return url  
*/  
public String getObjectURL(String bucketName, String objectName, Integer expires) throws Exception {  
return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).expiry(expires).build());  
}  
  
/**  
* 获取⽂件  
*  
* @param bucketName bucket名称  
* @param objectName ⽂件名称  
* @return ⼆进制流  
*/  
public InputStream getObject(String bucketName, String objectName) throws Exception {  
return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());  
}  
  
/**  
* 上传⽂件  
*  
* @param bucketName bucket名称  
* @param objectName ⽂件名称  
* @param stream ⽂件流  
* @throws Exception https://docs.minio.io/cn/java-minioClient-api-reference.html#putObject  
*/  
public void putObject(String bucketName, String objectName, InputStream stream) throws  
Exception {  
minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName)  
.stream(stream, stream.available(), -1).contentType(objectName.substring(objectName.lastIndexOf("."))).build());  
}  
  
/**  
* 上传⽂件  
*  
* @param bucketName bucket名称  
* @param objectName ⽂件名称  
* @param stream ⽂件流  
* @param size ⼤⼩  
* @param contextType 类型  
* @throws Exception https://docs.minio.io/cn/java-minioClient-api-reference.html#putObject  
*/  
public void putObject(String bucketName, String objectName, InputStream stream, long  
size, String contextType) throws Exception {  
minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(stream, size, -1).contentType(contextType).build());  
}  
  
/**  
* 获取⽂件信息  
*  
* @param bucketName bucket名称  
* @param objectName ⽂件名称  
* @throws Exception https://docs.minio.io/cn/java-minioClient-api-reference.html#statObject  
*/  
public ObjectStat getObjectInfo(String bucketName, String objectName) throws Exception {  
return minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());  
}  
  
/**  
* 删除⽂件  
*  
* @param bucketName bucket名称  
* @param objectName ⽂件名称  
* @throws Exception https://docs.minio.io/cn/java-minioClient-apireference.html#removeObject  
*/  
public void removeObject(String bucketName, String objectName) throws Exception {  
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());  
}  
  
  
/***  
* 上传视频  
* @param file  
* @param bucketName  
* @return  
* @throws Exception  
*/  
public UploadFileVO uploadVideo(MultipartFile file, String bucketName) throws Exception {  
//判断文件是否为空  
if (null == file || 0 == file.getSize()) {  
return null;  
}  
//判断存储桶是否存在 不存在则创建  
createBucket(bucketName);  
//文件名  
String originalFilename = file.getOriginalFilename();  
//新的文件名 = 时间戳_随机数.后缀名  
assert originalFilename != null;  
long now = System.currentTimeMillis() / 1000;  
String fileName = DateUtil.format(DateUtil.date(), "yyyyMMdd") + "_" + now + "_" + new Random().nextInt(1000) +  
originalFilename.substring(originalFilename.lastIndexOf("."));  
//开始上传  
log.info("file大小:{}", file.getSize());  
minioClient.putObject(  
PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(  
file.getInputStream(), file.getSize(), -1)  
.contentType("video/mp4")  
.build());  
String url = minioProperties.getEndpoint() + "/" + bucketName + "/" + fileName;  
String urlHost = minioProperties.getNginxHost() + "/" + bucketName + "/" + fileName;  
return new UploadFileVO(url, urlHost);  
}  
}