!1 feat(thumbnail-generator): The first visit to the thumbnail is to generate a thumbnail image #IA47NT

Merge pull request !1 from BaldHead/main
This commit is contained in:
一只会思考的猪 2024-06-14 08:30:58 +00:00 committed by Gitee
commit 61b08e1240
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
2 changed files with 123 additions and 100 deletions

View File

@ -8,6 +8,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* MinioPlus配置类
*
* @author contact@liuxp.me
* @since 2024/05/22
*/
@ -89,7 +90,11 @@ public class MinioPlusProperties {
/**
* 是否开启缩略图默认为true
*
* @since 2024-06-14 15:47:46
* feature 缩略图懒生成
*/
@Deprecated
private boolean enable = true;
/**

View File

@ -1,5 +1,6 @@
package org.liuxp.minioplus.core.engine.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Pair;
@ -54,7 +55,7 @@ public class StorageEngineServiceImpl implements StorageEngineService {
/**
* 上传任务初始化
*
* <p>
* 1.当前用户或其他用户上传过且已完成秒传新增文件元数据
* 2.当前用户上传过未完成断点续传
* 3.其他用户上传过未完成断点续传新增文件元数据
@ -64,7 +65,6 @@ public class StorageEngineServiceImpl implements StorageEngineService {
* @param fullFileName 文件名含扩展名
* @param fileSize 文件长度
* @param isPrivate 是否私有 false: true:
*
* @return {@link FileCheckResultVo}
*/
@Override
@ -242,7 +242,7 @@ public class StorageEngineServiceImpl implements StorageEngineService {
// 分片数量
saveDTO.setPartNumber(createUploadUrlRespBO.getPartCount());
// 预览图 0: 1:
saveDTO.setIsPreview(saveDTO.getStorageBucket().equals(StorageBucketEnums.IMAGE.getCode()) && properties.getThumbnail().isEnable());
saveDTO.setIsPreview(Boolean.FALSE);
// 是否私有 0: 1:
saveDTO.setIsPrivate(isPrivate);
// 创建人
@ -416,11 +416,10 @@ public class StorageEngineServiceImpl implements StorageEngineService {
try {
// 文件权限校验元数据为空或者当前登录用户不是文件所有者时抛出异常
this.authentication(metadata, fileKey, userId);
// 判断是否存在缩略图设置桶名称
String bucketName = Boolean.TRUE.equals(metadata.getIsPreview()) ? StorageBucketEnums.IMAGE_PREVIEW.getCode() : metadata.getStorageBucket();
// 生成缩略图
String bucketName = generatePreviewImage(metadata);
// 创建图片预览地址
return minioS3Client.getPreviewUrl(metadata.getFileMimeType(), bucketName, metadata.getStoragePath() + "/" + metadata.getFileMd5());
} catch (Exception e) {
// 打印日志
log.error(e.getMessage(), e);
@ -429,25 +428,41 @@ public class StorageEngineServiceImpl implements StorageEngineService {
}
}
/**
* 文件元数据
*
* @param metadata 文件元数据
* @return 缩略图桶路径
* @author <a href="mailto:tianxiang.deng@foxmail.com">BaldHead</a>
* @since 2024-06-14 14:44:52
*/
private String generatePreviewImage(FileMetadataInfoVo metadata) {
try {
if (Boolean.FALSE.equals(metadata.getIsPreview())) {
// 获取原图的bytes
byte[] imageOriginBytes = minioS3Client.getObject(StorageBucketEnums.IMAGE.getCode(), metadata.getStoragePath() + "/" + metadata.getFileMd5());
// 压缩缩略图
ByteArrayOutputStream largeImage = CommonUtil.resizeImage(new ByteArrayInputStream(imageOriginBytes), properties.getThumbnail().getSize());
byte[] largeImageBytes = largeImage.toByteArray();
minioS3Client.putObject(StorageBucketEnums.IMAGE_PREVIEW.getCode(), CommonUtil.getObjectName(metadata.getFileMd5()), new ByteArrayInputStream(largeImageBytes), largeImageBytes.length, metadata.getFileMimeType());
metadata.setIsPreview(Boolean.TRUE);
FileMetadataInfoUpdateDTO fileMetadataInfoUpdateDTO = BeanUtil.copyProperties(metadata, FileMetadataInfoUpdateDTO.class);
metadataRepository.update(fileMetadataInfoUpdateDTO);
return StorageBucketEnums.IMAGE_PREVIEW.getCode();
}
} catch (Exception e) {
// 打印日志
log.error(e.getMessage(), e);
// 任何异常统一返回给前端文件不存在
throw new MinioPlusException(MinioPlusErrorCode.FILE_EXIST_FAILED);
}
return null;
}
@Override
public Boolean createFile(FileMetadataInfoSaveDTO saveDTO, byte[] fileBytes) {
// 写入文件
minioS3Client.putObject(saveDTO.getStorageBucket(), CommonUtil.getObjectName(saveDTO.getFileMd5()), new ByteArrayInputStream(fileBytes), saveDTO.getFileSize(), saveDTO.getFileMimeType());
// 判断是否生成缩略图
if(Boolean.TRUE.equals(saveDTO.getIsPreview())){
try{
ByteArrayOutputStream largeImage = CommonUtil.resizeImage(new ByteArrayInputStream(fileBytes), properties.getThumbnail().getSize());
byte[] largeImageBytes = largeImage.toByteArray();
minioS3Client.putObject(StorageBucketEnums.IMAGE_PREVIEW.getCode(), CommonUtil.getObjectName(saveDTO.getFileMd5()), new ByteArrayInputStream(largeImageBytes), largeImageBytes.length, saveDTO.getFileMimeType());
}catch(Exception e){
log.error(MinioPlusErrorCode.FILE_PREVIEW_WRITE_FAILED.getMessage(),e);
throw new MinioPlusException(MinioPlusErrorCode.FILE_PREVIEW_WRITE_FAILED);
}
}
return true;
@ -522,6 +537,7 @@ public class StorageEngineServiceImpl implements StorageEngineService {
/**
* 根据用户取得文件元数据信息
* 当userId匹配时直接返回不匹配时检查是否存在公有元数据
*
* @param fileKey 文件KEY
* @param userId 用户主键
* @return 文件元数据信息
@ -603,6 +619,7 @@ public class StorageEngineServiceImpl implements StorageEngineService {
/**
* 断点续传-创建断点的URL
*
* @param fileMetadataVo 文件元数据信息
* @return CreateUploadUrlRespBO 分片结果
*/
@ -665,6 +682,7 @@ public class StorageEngineServiceImpl implements StorageEngineService {
/**
* 合并分片
*
* @param metadataInfo 文件元数据信息
* @param partMd5List 分片集合
* @return 合并结果