oss文件存储服务

This commit is contained in:
jiang 2024-06-21 13:16:11 +08:00
parent d86ddfaefe
commit f9b6ffa9cc
6 changed files with 76 additions and 229 deletions

View File

@ -51,19 +51,6 @@
<artifactId>fastdfs-client</artifactId> <artifactId>fastdfs-client</artifactId>
</dependency> </dependency>
<!-- Minio -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>${minio.version}</version>
</dependency>
<!-- bonus Api System -->
<dependency>
<groupId>com.bonus</groupId>
<artifactId>bonus-api-system</artifactId>
</dependency>
<!-- bonus Common Swagger --> <!-- bonus Common Swagger -->
<dependency> <dependency>
<groupId>com.bonus</groupId> <groupId>com.bonus</groupId>
@ -75,13 +62,19 @@
<artifactId>aliyun-sdk-oss</artifactId> <artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version> <version>3.10.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.mchange</groupId> <groupId>com.bonus</groupId>
<artifactId>mchange-commons-java</artifactId> <artifactId>bonus-common-core</artifactId>
<version>0.2.15</version>
<scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -2,11 +2,10 @@ package com.bonus.oss.controller;
import com.aliyun.oss.model.OSSObject; import com.aliyun.oss.model.OSSObject;
import com.bonus.common.core.domain.R; import com.bonus.common.core.domain.R;
import com.bonus.common.core.utils.file.FileUtils;
import com.bonus.oss.domain.OssInfo; import com.bonus.oss.domain.OssInfo;
import com.bonus.oss.service.OssService; import com.bonus.oss.service.OssService;
import com.bonus.oss.utils.FileUtils;
import org.apache.poi.ss.formula.functions.T; import org.apache.poi.ss.formula.functions.T;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@ -21,7 +20,6 @@ import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@RestController @RestController
@ -37,19 +35,20 @@ public class OssController {
* @return 文件信息 * @return 文件信息
*/ */
@PostMapping("/upload") @PostMapping("/upload")
public R<OssInfo> upload(@RequestParam("file") MultipartFile file) { public R<OssInfo> upload(MultipartFile file) {
return ossService.upload(file); return ossService.upload(file);
} }
/** /**
* 文件上传 * 文件上传
* *
* @param files 文件流数组 * @param files 文件流
* @return 上传结果 * @return 文件信息
*/ */
@PostMapping("/uploadMultiple") @PostMapping("/uploadFiles")
public R<List<OssInfo>> uploadMultiple(@RequestParam("files") MultipartFile[] files) { public R<List<OssInfo>> uploadFiles(MultipartFile[] files) {
return ossService.uploadMultiple(files); return ossService.uploadFiles(files);
} }
/** /**
@ -97,39 +96,4 @@ public class OssController {
public R<T> delete(@RequestParam String ossFilePath) { public R<T> delete(@RequestParam String ossFilePath) {
return ossService.delete(ossFilePath); return ossService.delete(ossFilePath);
} }
/**
* 多文件删除
*
* @param ossFilePaths 文件路径列表
* @return 删除结果
*/
@PostMapping("/deleteMultiple")
public R<T> deleteMultiple(@RequestParam List<String> ossFilePaths) {
return ossService.deleteMultiple(ossFilePaths);
}
/**
* 文件复制
*
* @param source 原oss文件存储地址
* @param path 目标oss文件存储地址
* @return 复制结果
*/
@PostMapping("/copy")
public R<T> copy(@RequestParam String source, @RequestParam String path) {
return ossService.copy(source, path);
}
/**
* 多文件复制
*
* @param sources 原oss文件存储地址列表
* @param paths 目标oss文件存储地址列表
* @return 复制结果
*/
@PostMapping("/copyMultiple")
public R<T> copyMultiple(@RequestParam List<String> sources, @RequestParam List<String> paths) {
return ossService.copyMultiple(sources, paths);
}
} }

View File

@ -1,72 +1,44 @@
package com.bonus.oss.domain; package com.bonus.oss.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/** /**
* @author 陈敏 * OssInfo类用于封装OSSObject Storage Service对象的相关信息
* @version Info.java, v 1.1 2021/11/15 10:16 chenmin Exp $ * 通过此类可以方便地管理和访问OSS对象的元数据如名称路径大小等
* Created on 2021/11/15
*/ */
@Builder
@Data
public class OssInfo { public class OssInfo {
/** /**
* 名称 * 文件或对象的名称
* 用于唯一标识OSS中的一个对象
*/ */
private String name; private String name;
/** /**
* oss里的路径存储路径 * 文件在OSS中的存储路径
* 该路径不包含Bucket名称仅指对象在Bucket内的相对路径
*/ */
private String path; private String path;
/** /**
* 对象大小 * 文件或对象的大小
* 以字符串形式表示单位可能为字节KBMB等
*/ */
private String length; private String length;
/** /**
* 文件类型 * 文件的类型
* 可以是文件的MIME类型或者根据文件扩展名推测的类型
*/ */
private String fileType; private String fileType;
/** /**
* Bucket名称 * 存储文件的Bucket名称
**/ * Bucket是OSS中用于存储对象的容器每个对象必须属于某个Bucket
*/
private String bucketName; private String bucketName;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getLength() {
return length;
}
public void setLength(String length) {
this.length = length;
}
public String getFileType() {
return fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
public String getBucketName() {
return bucketName;
}
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
} }

View File

@ -33,39 +33,11 @@ public interface OssService {
* @return 操作结果 * @return 操作结果
*/ */
R<T> delete(String ossFilePath); R<T> delete(String ossFilePath);
/**
* 文件复制
*
* @param source 原oss文件存储地址
* @param path 目标oss文件存储地址
* @return 操作结果
*/
R<T> copy(String source, String path);
/** /**
* 多文件上传 * 多文件上传
* *
* @param files 文件流数组 * @param files 文件流
* @return 上传结果 * @return 文件信息
*/ */
R<List<OssInfo>> uploadMultiple(MultipartFile[] files); R<List<OssInfo>> uploadFiles(MultipartFile[] files);
/**
* 多文件删除
*
* @param ossFilePaths oss文件存储地址列表
* @return 删除结果
*/
R<T> deleteMultiple(List<String> ossFilePaths);
/**
* 多文件复制
*
* @param sources 源oss文件存储地址列表
* @param paths 目标oss文件存储地址列表
* @return 复制结果
*/
R<T> copyMultiple(List<String> sources, List<String> paths);
} }

View File

@ -2,9 +2,9 @@ package com.bonus.oss.service.impl;
import com.aliyun.oss.model.OSSObject; import com.aliyun.oss.model.OSSObject;
import com.bonus.common.core.domain.R; import com.bonus.common.core.domain.R;
import com.bonus.common.core.utils.file.FileUtils;
import com.bonus.oss.domain.OssInfo; import com.bonus.oss.domain.OssInfo;
import com.bonus.oss.service.OssService; import com.bonus.oss.service.OssService;
import com.bonus.oss.utils.FileUtils;
import com.bonus.oss.utils.OssUtils; import com.bonus.oss.utils.OssUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.poi.ss.formula.functions.T; import org.apache.poi.ss.formula.functions.T;
@ -12,6 +12,7 @@ import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -24,16 +25,16 @@ public class OssServiceImpl implements OssService {
/** /**
* 文件上传 * 文件上传
* *
* @param file 文件流 * @param multipartFile 文件流
* @return 文件信息 * @return 文件信息
*/ */
@Override @Override
public R<OssInfo> upload(MultipartFile file) { public R<OssInfo> upload(MultipartFile multipartFile) {
try { try {
if (!FileUtils.isValidFile(file)) { String objectKey = multipartFile.getOriginalFilename();
return R.fail("File is empty or File size exceeds 5GB!"); File file = FileUtils.multipartFileToFile(multipartFile);
} objectKey = FileUtils.generateObjectName(objectKey);
return ossUtils.upload(file); return ossUtils.upload(objectKey, file);
} catch (Exception e) { } catch (Exception e) {
return R.fail("File upload failed."); return R.fail("File upload failed.");
} }
@ -67,71 +68,25 @@ public class OssServiceImpl implements OssService {
} }
} }
/**
* 文件复制
*
* @param source 原oss文件存储地址target
* @param path 目标oss文件存储地址
*/
@Override
public R<T> copy(String source, String path) {
return ossUtils.copy(source, path);
}
/** /**
* 多文件上传 * 多文件上传
* *
* @param files 文件流数组 * @param files 文件流
* @return 上传结果 * @return 文件信息
*/ */
@Override @Override
public R<List<OssInfo>> uploadMultiple(MultipartFile[] files) { public R<List<OssInfo>> uploadFiles(MultipartFile[] files) {
List<OssInfo> uploadedFilesInfo = new ArrayList<>(); try {
for (MultipartFile file : files) { List<OssInfo> ossInfos = new ArrayList<>();
R<OssInfo> result = upload(file); for (MultipartFile multipartFile : files) {
if (R.isError(result)) { String objectKey = multipartFile.getOriginalFilename();
return R.fail("部分文件上传失败"); File file = FileUtils.multipartFileToFile(multipartFile);
objectKey = FileUtils.generateObjectName(objectKey);
ossInfos.add(ossUtils.upload(objectKey, file).getData());
} }
uploadedFilesInfo.add(result.getData()); return R.ok(ossInfos);
} catch (Exception e) {
return R.fail("File upload failed.");
} }
return R.ok(uploadedFilesInfo);
}
/**
* 多文件删除
*
* @param ossFilePaths oss文件存储地址列表
* @return 删除结果
*/
@Override
public R<T> deleteMultiple(List<String> ossFilePaths) {
for (String path : ossFilePaths) {
R<T> result = delete(path);
if (R.isError(result)) {
return R.fail("部分文件删除失败");
}
}
return R.ok();
}
/**
* 多文件复制
*
* @param sources 源oss文件存储地址列表
* @param paths 目标oss文件存储地址列表
* @return 复制结果
*/
@Override
public R<T> copyMultiple(List<String> sources, List<String> paths) {
if (sources.size() != paths.size()) {
return R.fail("源文件和目标文件数量不匹配");
}
for (int i = 0; i < sources.size(); i++) {
R<T> result = copy(sources.get(i), paths.get(i));
if (R.isError(result)) {
return R.fail("部分文件复制失败");
}
}
return R.ok();
} }
} }

View File

@ -47,21 +47,15 @@ public class OssUtils {
/** /**
* 上传文件 * 上传文件
* *
* @param param MultipartFile对象 * @param file File
* @return 包含上传文件信息的R对象 * @return 包含上传文件信息的R对象
*/ */
public R<OssInfo> upload(MultipartFile param) { public R<OssInfo> upload(String objectKey, File file) {
// 获取上传文件的原始文件名
String originalFilename = param.getOriginalFilename();
// 将MultipartFile转换为File
File file = FileUtils.multipartFileToFile(param);
try { try {
// 生成唯一的对象名
String objectName = FileUtils.generateObjectName(originalFilename);
// 上传文件到OSS // 上传文件到OSS
ossClient.putObject(ossConfig.getBucket(), objectName, file); ossClient.putObject(ossConfig.getBucket(), objectKey, file);
// 获取上传文件的信息并返回 // 获取上传文件的信息并返回
return R.ok(getInfo(originalFilename, objectName)); return R.ok(getInfo(objectKey));
} catch (Exception e) { } catch (Exception e) {
LOGGER.error("文件上传失败", e); LOGGER.error("文件上传失败", e);
return R.fail("文件上传失败"); return R.fail("文件上传失败");
@ -76,21 +70,18 @@ public class OssUtils {
/** /**
* 获取文件信息 * 获取文件信息
* *
* @param filename 文件名
* @param ossFilePath 文件路径 * @param ossFilePath 文件路径
* @return 包含文件信息的OssInfo对象 * @return 包含文件信息的OssInfo对象
*/ */
public OssInfo getInfo(String filename, String ossFilePath) { public OssInfo getInfo(String ossFilePath) {
try { try {
// 获取文件的元数据 // 获取文件的元数据
ObjectMetadata objectMetadata = ossClient.getObjectMetadata(ossConfig.getBucket(), ossFilePath); ObjectMetadata objectMetadata = ossClient.getObjectMetadata(ossConfig.getBucket(), ossFilePath);
OssInfo ossInfo = new OssInfo(); OssInfo ossInfo = OssInfo.builder()
// 设置文件信息 .bucketName(ossConfig.getBucket())
ossInfo.setLength(Convert.toStr(objectMetadata.getContentLength())); .fileType(objectMetadata.getContentType())
ossInfo.setFileType(objectMetadata.getContentType()); .length(Convert.toStr(objectMetadata.getContentLength()))
ossInfo.setName(filename); .path(ossFilePath).build();
ossInfo.setBucketName(ossConfig.getBucket());
ossInfo.setPath(ossFilePath);
return ossInfo; return ossInfo;
} catch (Exception e) { } catch (Exception e) {
LOGGER.error("获取文件信息失败", e); LOGGER.error("获取文件信息失败", e);