From 8d9fd8020ff86e7b0c8867ed9d5919c84dc09923 Mon Sep 17 00:00:00 2001 From: jiang Date: Fri, 28 Jun 2024 10:06:47 +0800 Subject: [PATCH] =?UTF-8?q?obs=E6=96=87=E4=BB=B6=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bonus/obs/controller/ObsController.java | 25 ++++-- .../com/bonus/obs/service/ObsService.java | 7 +- .../obs/service/impl/ObsServiceImpl.java | 30 +++++-- .../java/com/bonus/obs/utils/FileUtils.java | 85 ------------------- .../java/com/bonus/obs/utils/ObsUtils.java | 12 ++- 5 files changed, 59 insertions(+), 100 deletions(-) delete mode 100644 bonus-modules/bonus-obs/src/main/java/com/bonus/obs/utils/FileUtils.java diff --git a/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/controller/ObsController.java b/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/controller/ObsController.java index d0b9d8a..f972de7 100644 --- a/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/controller/ObsController.java +++ b/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/controller/ObsController.java @@ -2,10 +2,10 @@ package com.bonus.obs.controller; import com.bonus.common.core.domain.R; import com.bonus.common.core.utils.file.FileUtils; +import com.bonus.obs.domain.ObsInfo; import com.bonus.obs.service.ObsService; import com.obs.services.model.DeleteObjectResult; import com.obs.services.model.ObsObject; -import com.obs.services.model.PutObjectResult; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -19,6 +19,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.List; @RestController @RequestMapping("/obs") @@ -29,12 +30,12 @@ public class ObsController { /** * 文件上传 * - * @param param 文件流 + * @param file 文件流 * @return 文件信息 */ - @PostMapping("/upload") - public R uploadFile(MultipartFile param) { - return service.uploadFile(param); + @PostMapping("/uploadFile") + public R uploadFile(MultipartFile file) { + return service.uploadFile(file); } /** @@ -42,7 +43,7 @@ public class ObsController { * * @param objectKey 文件在OBS中的键 */ - @PostMapping("/delete") + @PostMapping("/deleteFile") public R deleteFile(String objectKey) { return service.deleteFile(objectKey); } @@ -87,4 +88,16 @@ public class ObsController { } } + + /** + * 文件上传 + * + * @param files 文件流 + * @return 文件信息 + */ + @PostMapping("/uploadFiles") + public R> uploadFiles(MultipartFile[] files) { + return service.uploadFiles(files); + } + } diff --git a/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/service/ObsService.java b/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/service/ObsService.java index 027805a..1249786 100644 --- a/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/service/ObsService.java +++ b/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/service/ObsService.java @@ -1,11 +1,14 @@ package com.bonus.obs.service; import com.bonus.common.core.domain.R; +import com.bonus.obs.domain.ObsInfo; import com.obs.services.model.DeleteObjectResult; import com.obs.services.model.ObsObject; import com.obs.services.model.PutObjectResult; import org.springframework.web.multipart.MultipartFile; +import java.util.List; + public interface ObsService { /** * 文件上传 @@ -13,7 +16,7 @@ public interface ObsService { * @param file 文件流 * @return 文件信息 */ - R uploadFile(MultipartFile file); + R uploadFile(MultipartFile file); /** * 删除文件从OBS @@ -36,5 +39,5 @@ public interface ObsService { * @param files 文件流 * @return 文件信息 */ - R uploadFiles(MultipartFile[] files); + R> uploadFiles(MultipartFile[] files); } diff --git a/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/service/impl/ObsServiceImpl.java b/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/service/impl/ObsServiceImpl.java index 16de3af..229791a 100644 --- a/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/service/impl/ObsServiceImpl.java +++ b/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/service/impl/ObsServiceImpl.java @@ -1,7 +1,9 @@ package com.bonus.obs.service.impl; +import com.alibaba.nacos.common.utils.UuidUtils; import com.bonus.common.core.domain.R; import com.bonus.common.core.utils.file.FileUtils; +import com.bonus.obs.domain.ObsInfo; import com.bonus.obs.service.ObsService; import com.bonus.obs.utils.ObsUtils; import com.obs.services.model.DeleteObjectResult; @@ -12,6 +14,9 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; @Service public class ObsServiceImpl implements ObsService { @@ -25,11 +30,14 @@ public class ObsServiceImpl implements ObsService { * @return 文件信息 */ @Override - public R uploadFile(MultipartFile file) { + public R uploadFile(MultipartFile file) { try { - String objectKey = file.getOriginalFilename(); + String originalFilename = Objects.requireNonNull(file.getOriginalFilename(), "文件名不能为空"); + String extension = originalFilename.substring(originalFilename.lastIndexOf('.')); + String objectKey = UuidUtils.generateUuid() + extension; objectKey = FileUtils.generateObjectName(objectKey); - return obsUtils.uploadFile(objectKey, FileUtils.multipartFileToFile(file)); + ObsInfo obsInfo = obsUtils.uploadFile(objectKey, FileUtils.multipartFileToFile(file)); + return R.ok(obsInfo); } catch (Exception e) { return R.fail(e.getMessage()); } @@ -62,7 +70,19 @@ public class ObsServiceImpl implements ObsService { * @return 文件信息 */ @Override - public R uploadFiles(MultipartFile[] files) { - return null; + public R> uploadFiles(MultipartFile[] files) { + try { + List obsInfos = new ArrayList<>(); + for (MultipartFile multipartFile : files) { + String originalFilename = Objects.requireNonNull(multipartFile.getOriginalFilename(), "文件名不能为空"); + String extension = originalFilename.substring(originalFilename.lastIndexOf('.')); + String objectKey = UuidUtils.generateUuid() + extension; + objectKey = FileUtils.generateObjectName(objectKey); + obsInfos.add(obsUtils.uploadFile(objectKey, FileUtils.multipartFileToFile(multipartFile))); + } + return R.ok(obsInfos, "文件上传成功"); + } catch (Exception e) { + return R.fail("File upload failed."); + } } } diff --git a/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/utils/FileUtils.java b/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/utils/FileUtils.java deleted file mode 100644 index c40d5d0..0000000 --- a/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/utils/FileUtils.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.bonus.obs.utils; - -import com.bonus.common.core.utils.StringUtils; -import org.springframework.web.multipart.MultipartFile; - -import java.io.File; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.text.SimpleDateFormat; -import java.util.Date; - -public class FileUtils { - /** - * 检查MultipartFile是否有效(不为空且大小不超过5GB) - * - * @param file MultipartFile对象 - * @return 文件有效返回true,否则返回false - */ - public static boolean isValidFile(MultipartFile file) { - if (file == null || file.isEmpty()) { - return false; - } - // 文件大小限制为5GB - long maxSizeInBytes = 5L * 1024 * 1024 * 1024; - return file.getSize() <= maxSizeInBytes; - } - - /** - * 生成统一路径的objectName - * - * @param fileName 文件名 - * @return 生成的objectName - */ - public static String generateObjectName(String fileName) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); - String datePath = sdf.format(new Date()); - return "uploads/" + datePath + "/" + fileName; - } - - - public static boolean isValidOssFilePath(String ossFilePath) { - // 根据实际情况添加对ossFilePath的校验逻辑,确保其只包含安全的字符 - return StringUtils.hasText(ossFilePath) && ossFilePath.matches("^[\\w\\d\\-\\_\\.]+$"); - } - - public static String sanitizeFileName(String fileName) { - // 避免文件名注入,移除或替换不安全的字符 - return fileName.replaceAll("[^a-zA-Z0-9\\.\\-_]", "_"); - } - - - /** - * 从文件路径中提取文件名 - * @param ossFilePath 文件路径 - * @return 文件名 - */ - public static String getFileNameFromPath(String ossFilePath) { - Path path = Paths.get(ossFilePath); - return path.getFileName().toString(); - } - - - /** - * MultipartFile 转 File - * - * @param multiFile MultipartFile对象 - * @return 转换后的File对象 - */ - public static File multipartFileToFile(MultipartFile multiFile) { - try { - String fileName = multiFile.getOriginalFilename(); - if (fileName == null) { - return null; - } - String prefix = fileName.substring(0, fileName.lastIndexOf(".")); - String suffix = fileName.substring(fileName.lastIndexOf(".")); - File file = File.createTempFile(prefix, suffix); - multiFile.transferTo(file); - return file; - } catch (Exception e) { - return null; - } - } - -} diff --git a/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/utils/ObsUtils.java b/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/utils/ObsUtils.java index f54e772..92b788f 100644 --- a/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/utils/ObsUtils.java +++ b/bonus-modules/bonus-obs/src/main/java/com/bonus/obs/utils/ObsUtils.java @@ -1,7 +1,9 @@ package com.bonus.obs.utils; import com.bonus.common.core.domain.R; +import com.bonus.common.core.utils.file.FileUtils; import com.bonus.obs.config.ObsConfig; +import com.bonus.obs.domain.ObsInfo; import com.obs.services.ObsClient; import com.obs.services.model.DeleteObjectResult; import com.obs.services.model.GetObjectRequest; @@ -42,8 +44,14 @@ public class ObsUtils { * @param file 要上传的文件 * @return 上传结果 */ - public R uploadFile(String objectKey, File file) { - return R.ok(obsClient.putObject(obsConfig.getBucket(), objectKey, file)); + public ObsInfo uploadFile(String objectKey, File file) { + PutObjectResult putObjectResult = obsClient.putObject(obsConfig.getBucket(), objectKey, file); + + return ObsInfo.builder() + .bucketName(obsConfig.getBucket()) + .name(FileUtils.getName(objectKey)) + .path(objectKey) + .build(); } /**