package com.ruoyi.basic.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.basic.entity.StorageAttachment; import com.ruoyi.basic.entity.StorageBlob; import com.ruoyi.basic.entity.dto.StorageBlobDTO; import com.ruoyi.basic.mapper.StorageAttachmentMapper; import com.ruoyi.basic.mapper.StorageBlobMapper; import com.ruoyi.basic.service.StorageBlobService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.config.MinioConfig; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.MinioResult; import com.ruoyi.common.exception.file.InvalidExtensionException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.MinioUtils; import com.ruoyi.common.utils.uuid.IdUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; import java.util.List; /** *

* 通用文件上传的附件信息 服务实现类 *

* * @author ruoyi * @since 2025-05-29 */ @Service @RequiredArgsConstructor public class StorageBlobServiceImpl extends ServiceImpl implements StorageBlobService { @Autowired private StorageAttachmentMapper storageAttachmentMapper; @Autowired private StorageBlobMapper storageBlobMapper; @Autowired private MinioUtils minioUtils; @Override public List updateStorageBlobs(List files, String bucketName) { // 若没传入bucketName,则使用默认bucketName if (StringUtils.isEmpty(bucketName)) { bucketName = minioUtils.getDefaultBucket(); } List storageBlobDTOs = new ArrayList<>(); for (MultipartFile file : files) { try { MinioResult res = minioUtils.upload(bucketName, file, false); StorageBlobDTO dto = new StorageBlobDTO(); dto.setContentType(file.getContentType()); dto.setBucketFilename(res.getBucketFileName()); dto.setOriginalFilename(res.getOriginalName()); dto.setByteSize(file.getSize()); dto.setKey(IdUtils.simpleUUID()); dto.setBucketName(bucketName); dto.setCreateTime(DateUtils.getNowDate()); dto.setUrl(minioUtils.getPreviewUrl(res.getBucketFileName(), bucketName, false)); // 插入数据库 storageBlobMapper.insert(dto); storageBlobDTOs.add(dto); } catch (InvalidExtensionException e) { throw new RuntimeException("minio文件上传异常:" + e); } } return storageBlobDTOs; } @Override public int deleteStorageBlobs(StorageAttachment attachment) { List attachments = storageAttachmentMapper.selectList(new LambdaQueryWrapper() .eq(StorageAttachment::getRecordId, attachment.getRecordId()) .eq(StorageAttachment::getRecordType, attachment.getRecordType()) .eq(StorageAttachment::getName, attachment.getName())); List ids = attachments.stream().map(StorageAttachment::getStorageBlobId).toList(); List storageBlobs = storageBlobMapper.selectList(new LambdaQueryWrapper() .in(StorageBlob::getId, ids)); if (!storageBlobs.isEmpty()) { for (StorageBlob storageBlob : storageBlobs) { // 移除桶内文件 minioUtils.removeObjectsResult(storageBlob.getBucketName(), storageBlob.getBucketName()); } } if (!ids.isEmpty()) { return storageBlobMapper.delete(new QueryWrapper().lambda().in(StorageBlob::getId, ids)); } return 0; } }