From 1a376098d2e27eeb9c2af90fa501311c2035d5ab Mon Sep 17 00:00:00 2001 From: buhuazhen <hua100783@gmail.com> Date: 星期三, 27 八月 2025 14:30:41 +0800 Subject: [PATCH] :zap: 对于前端修改 采购和应付 --- ruoyi-common/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java | 96 ++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 80 insertions(+), 16 deletions(-) diff --git a/ruoyi-common/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java b/ruoyi-common/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java index 1c51d86..1939119 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java +++ b/ruoyi-common/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java @@ -5,21 +5,25 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.entity.StorageAttachment; import com.ruoyi.basic.entity.StorageBlob; +import com.ruoyi.basic.entity.dto.SimpleStorageDto; 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.ruoyi.common.core.domain.MinioResult; +import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.exception.file.InvalidExtensionException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.MinioUtils; import com.ruoyi.common.utils.uuid.IdUtils; import lombok.RequiredArgsConstructor; +import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -44,7 +48,7 @@ private MinioUtils minioUtils; @Override - public List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName,Long type) { + public List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName, Long type) { // 鑻ユ病浼犲叆bucketName锛屽垯浣跨敤榛樿bucketName if (StringUtils.isEmpty(bucketName)) { @@ -53,27 +57,74 @@ List<StorageBlobDTO> storageBlobDTOs = new ArrayList<>(); for (MultipartFile file : files) { try { + validateFileExtension(file); + 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.setUrl(minioUtils.getPreviewUrl(res.getBucketFileName(), bucketName, false)); - dto.setDownloadUrl(minioUtils.getDownloadUrl(res.getBucketFileName(), bucketName)); - if (type != null){ - dto.setType(type); - } - // 鎻掑叆鏁版嵁搴� + + StorageBlobDTO dto = buildStorageBlobDTO(file, res, bucketName, type); + storageBlobMapper.insert(dto); storageBlobDTOs.add(dto); + } catch (InvalidExtensionException e) { - throw new RuntimeException("minio鏂囦欢涓婁紶寮傚父锛�" + e); + throw new RuntimeException("涓嶆敮鎸佺殑鏂囦欢绫诲瀷锛�" + file.getOriginalFilename(), e); + } catch (Exception e) { + throw new RuntimeException("涓婁紶鏂囦欢澶辫触锛�" + file.getOriginalFilename(), e); } } return storageBlobDTOs; + } + + private void validateFileExtension(MultipartFile file) throws InvalidExtensionException { + String filename = file.getOriginalFilename(); + String extension = FilenameUtils.getExtension(filename).toLowerCase(); + List<String> allowedExtensions = Arrays.asList( + // 鍥剧墖 + "jpg", "jpeg", "png", "gif", "bmp", "webp", "tiff", "ico", "svg", + + // 鏂囨。 + "pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt", "rtf", "md", "csv", "odt", + + // 瑙嗛 + "mp4", "mov", "avi", "wmv", "flv", "mkv", "webm", "mpeg", "3gp", "MOV", + + // 闊抽 + "mp3", "wav", "ogg", "aac", "flac", "m4a", "wma", "amr", + + // 鍘嬬缉鍖� + "zip", "rar", "7z", "tar", "gz", "bz2", "xz", + + // 缂栫▼浠g爜鏂囦欢 + "java", "py", "js", "ts", "html", "css", "cpp", "c", "cs", "json", "xml", "sql", "yaml", "yml", "sh", "bat", + + // 瀹夎绋嬪簭 & 浜岃繘鍒� + "exe", "apk", "dmg", "msi", "bin", "iso", + + // 璁捐绫� + "psd", "ai", "xd", "sketch", "fig" + ); + + if (!allowedExtensions.contains(extension)) { + throw new BaseException("鏂囦欢绫诲瀷涓嶈鍏佽锛�" + extension); + } + } + + private StorageBlobDTO buildStorageBlobDTO(MultipartFile file, MinioResult res, String bucketName, Long type) { + 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.setUrl(minioUtils.getPreviewUrl(res.getBucketFileName(), bucketName, false)); + dto.setDownloadUrl(minioUtils.getDownloadUrl(res.getBucketFileName(), bucketName)); + + if (type != null) { + dto.setType(type); + } + + return dto; } @Override @@ -92,7 +143,7 @@ new LambdaQueryWrapper<StorageBlob>().in(StorageBlob::getId, ids) ); } - + // 绉婚櫎MinIO涓殑鏂囦欢 if (!storageBlobs.isEmpty()) { for (StorageBlob storageBlob : storageBlobs) { @@ -108,4 +159,17 @@ } return 0; } + + @Override + public List<SimpleStorageDto> findStorageByIds(List<Long> ids, String bucketName) { + if (ids == null || ids.isEmpty()) { + return List.of(); + } + return storageBlobMapper.selectByIds(ids).parallelStream().map(it -> { + SimpleStorageDto dto = new SimpleStorageDto(it.getId(), it.getContentType(), it.getOriginalFilename(), it.getCreateTime()); + dto.setDownloadUrl(minioUtils.getDownloadUrls(it.getBucketFilename(), bucketName, it.getOriginalFilename(), true)); + dto.setUrl(minioUtils.getPreviewUrl(it.getBucketFilename(), bucketName, true)); + return dto; + }).toList(); + } } -- Gitblit v1.9.3