From 1e8ccfec6ebcf7787def13165d9932b0cccefc49 Mon Sep 17 00:00:00 2001 From: liding <756868258@qq.com> Date: 星期五, 20 六月 2025 14:34:45 +0800 Subject: [PATCH] 1.文件上传格式调整 2.表格调整 --- ruoyi-common/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java | 118 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 87 insertions(+), 31 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 dc7acff..cf2094e 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 @@ -2,29 +2,29 @@ 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.base.BaseException; 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 lombok.RequiredArgsConstructor; +import org.apache.commons.io.FilenameUtils; 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.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * <p> @@ -47,37 +47,83 @@ private MinioUtils minioUtils; @Override - public List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName) { + public List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName,Long type) { // 鑻ユ病浼犲叆bucketName锛屽垯浣跨敤榛樿bucketName if (StringUtils.isEmpty(bucketName)) { - bucketName = minioUtils.getDefaultBucket(); + bucketName = minioUtils.getDefaultBucket(); } - List<StorageBlobDTO> 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); + validateFileExtension(file); + MinioResult res = minioUtils.upload(bucketName, file, false); + + 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 @@ -86,20 +132,30 @@ .eq(StorageAttachment::getRecordId, attachment.getRecordId()) .eq(StorageAttachment::getRecordType, attachment.getRecordType()) .eq(StorageAttachment::getName, attachment.getName())); - List<Long> ids = attachments.stream().map(StorageAttachment::getStorageBlobId).toList(); - List<StorageBlob> storageBlobs = storageBlobMapper.selectList(new LambdaQueryWrapper<StorageBlob>() - .in(StorageBlob::getId, ids)); + List<Long> ids = attachments.stream() + .map(StorageAttachment::getStorageBlobId) + .collect(Collectors.toList()); + List<StorageBlob> storageBlobs = new ArrayList<>(); + if (!ids.isEmpty()) { + // 鍙湪ID鍒楄〃闈炵┖鏃舵墽琛屾煡璇� + storageBlobs = storageBlobMapper.selectList( + new LambdaQueryWrapper<StorageBlob>().in(StorageBlob::getId, ids) + ); + } + + // 绉婚櫎MinIO涓殑鏂囦欢 if (!storageBlobs.isEmpty()) { for (StorageBlob storageBlob : storageBlobs) { - // 绉婚櫎妗跺唴鏂囦欢 - minioUtils.removeObjectsResult(storageBlob.getBucketName(), storageBlob.getBucketName()); + minioUtils.removeObjectsResult(storageBlob.getBucketName(), storageBlob.getBucketFilename()); } } + // 鍒犻櫎鏁版嵁搴撹褰� if (!ids.isEmpty()) { - return storageBlobMapper.delete(new QueryWrapper<StorageBlob>().lambda().in(StorageBlob::getId, ids)); + return storageBlobMapper.delete( + new QueryWrapper<StorageBlob>().lambda().in(StorageBlob::getId, ids) + ); } - return 0; } } -- Gitblit v1.9.3