diff --git a/src/main/java/com/youlai/system/service/OssService.java b/src/main/java/com/youlai/system/service/OssService.java index 37202dea..04875d1a 100644 --- a/src/main/java/com/youlai/system/service/OssService.java +++ b/src/main/java/com/youlai/system/service/OssService.java @@ -4,9 +4,7 @@ import com.youlai.system.model.dto.FileInfo; import org.springframework.web.multipart.MultipartFile; /** - * 文件接口 - *
- * 已实现 MinIO + * 对象存储服务接口层 * * @author haoxr * @since 2022/11/19 @@ -16,15 +14,15 @@ public interface OssService { /** * 上传文件 * @param file 表单文件对象 - * @return + * @return 文件信息 */ FileInfo uploadFile(MultipartFile file); /** * 删除文件 * - * @param filePath - * @return + * @param filePath 文件完整URL + * @return 删除结果 */ boolean deleteFile(String filePath); diff --git a/src/main/java/com/youlai/system/service/impl/oss/AliyunOssService.java b/src/main/java/com/youlai/system/service/impl/oss/AliyunOssService.java index f1f241ed..d4a06a5f 100644 --- a/src/main/java/com/youlai/system/service/impl/oss/AliyunOssService.java +++ b/src/main/java/com/youlai/system/service/impl/oss/AliyunOssService.java @@ -8,7 +8,6 @@ import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectRequest; -import com.aliyun.oss.model.PutObjectResult; import com.youlai.system.model.dto.FileInfo; import com.youlai.system.service.OssService; import jakarta.annotation.PostConstruct; @@ -69,33 +68,30 @@ public class AliyunOssService implements OssService { String fileName = DateUtil.format(LocalDateTime.now(), "yyyy/MM/dd") + "/" + uuid + "." + suffix; // try-with-resource 语法糖自动释放流 try (InputStream inputStream = file.getInputStream()) { - // 创建PutObjectRequest对象,指定Bucket名称、对象名称和输入流 - PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, inputStream); // 设置上传文件的元信息,例如Content-Type ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(file.getContentType()); - putObjectRequest.setMetadata(metadata); - + // 创建PutObjectRequest对象,指定Bucket名称、对象名称和输入流 + PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, inputStream, metadata); // 上传文件 - PutObjectResult putObjectResult = aliyunOssClient.putObject(putObjectRequest); - - // 获取文件访问路径 - String fileUrl = "https://" + bucketName + ".oss-cn-hangzhou.aliyuncs.com/" + fileName; - FileInfo fileInfo = new FileInfo(); - fileInfo.setName(fileName); - fileInfo.setUrl(fileUrl); - return fileInfo; + aliyunOssClient.putObject(putObjectRequest); } catch (Exception e) { throw new RuntimeException("文件上传失败"); } + // 获取文件访问路径 + String fileUrl = "https://" + bucketName + "." + endpoint + "/" + fileName; + FileInfo fileInfo = new FileInfo(); + fileInfo.setName(fileName); + fileInfo.setUrl(fileUrl); + return fileInfo; } @Override public boolean deleteFile(String filePath) { Assert.notBlank(filePath, "删除文件路径不能为空"); - String tempStr = "/" + bucketName + "/"; - String fileName = filePath.substring(filePath.indexOf(tempStr) + tempStr.length()); // 2022/11/20/test.jpg + String fileHost = "https://" + bucketName + "." + endpoint; // 文件主机域名 + String fileName = filePath.substring(fileHost.length() + 1); // +1 是/占一个字符,截断左闭右开 aliyunOssClient.deleteObject(bucketName, fileName); return true; } diff --git a/src/main/java/com/youlai/system/service/impl/oss/MinioOssService.java b/src/main/java/com/youlai/system/service/impl/oss/MinioOssService.java index 37538dee..6600c1c5 100644 --- a/src/main/java/com/youlai/system/service/impl/oss/MinioOssService.java +++ b/src/main/java/com/youlai/system/service/impl/oss/MinioOssService.java @@ -37,7 +37,7 @@ import java.time.LocalDateTime; public class MinioOssService implements OssService { /** - * 服务Endpoint + * 服务Endpoint(http://localhost:9000) */ private String endpoint; /** @@ -53,7 +53,7 @@ public class MinioOssService implements OssService { */ private String bucketName; /** - * 自定义域名 + * 自定义域名(https://oss.youlai.tech) */ private String customDomain; @@ -81,7 +81,7 @@ public class MinioOssService implements OssService { // 生成文件名(日期文件夹) String suffix = FileUtil.getSuffix(file.getOriginalFilename()); String uuid = IdUtil.simpleUUID(); - String fileName = DateUtil.format(LocalDateTime.now(), "yyyy/MM/dd") + "/" + uuid + "." + suffix; + String fileName = DateUtil.format(LocalDateTime.now(), "yyyyMMdd") + "/" + uuid + "." + suffix; // try-with-resource 语法糖自动释放流 try (InputStream inputStream = file.getInputStream()) { // 文件上传 @@ -121,27 +121,33 @@ public class MinioOssService implements OssService { * 删除文件 * * @param filePath 文件路径 - * https://oss.youlai.tech/default/2022/11/20/test.jpg + * https://oss.youlai.tech/default/20221120/test.jpg * @return */ @Override public boolean deleteFile(String filePath) { Assert.notBlank(filePath, "删除文件路径不能为空"); - String tempStr = "/" + bucketName + "/"; - String fileName = filePath.substring(filePath.indexOf(tempStr) + tempStr.length()); // 2022/11/20/test.jpg - - RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder() - .bucket(bucketName) - .object(fileName) - .build(); try { + String fileName; + if (StrUtil.isNotBlank(customDomain)) { + // https://oss.youlai.tech/default/20221120/test.jpg → 20221120/test.jpg + fileName = filePath.substring(customDomain.length() + 1 + bucketName.length() + 1); // 两个/占了2个字符长度 + } else { + // http://localhost:9000/default/20221120/test.jpg → 20221120/test.jpg + fileName = filePath.substring(endpoint.length() + 1 + bucketName.length() + 1); + } + RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder() + .bucket(bucketName) + .object(fileName) + .build(); + minioClient.removeObject(removeObjectArgs); + return true; } catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException | InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException | XmlParserException e) { throw new RuntimeException(e); } - return true; }