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>
</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 -->
<dependency>
<groupId>com.bonus</groupId>
@ -75,13 +62,19 @@
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
<version>0.2.15</version>
<scope>compile</scope>
<groupId>com.bonus</groupId>
<artifactId>bonus-common-core</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>

View File

@ -2,11 +2,10 @@ package com.bonus.oss.controller;
import com.aliyun.oss.model.OSSObject;
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.service.OssService;
import com.bonus.oss.utils.FileUtils;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
@ -21,7 +20,6 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
@RestController
@ -37,19 +35,20 @@ public class OssController {
* @return 文件信息
*/
@PostMapping("/upload")
public R<OssInfo> upload(@RequestParam("file") MultipartFile file) {
public R<OssInfo> upload(MultipartFile file) {
return ossService.upload(file);
}
/**
* 文件上传
* 文件上传
*
* @param files 文件流数组
* @return 上传结果
* @param files 文件流
* @return 文件信息
*/
@PostMapping("/uploadMultiple")
public R<List<OssInfo>> uploadMultiple(@RequestParam("files") MultipartFile[] files) {
return ossService.uploadMultiple(files);
@PostMapping("/uploadFiles")
public R<List<OssInfo>> uploadFiles(MultipartFile[] files) {
return ossService.uploadFiles(files);
}
/**
@ -97,39 +96,4 @@ public class OssController {
public R<T> delete(@RequestParam String 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;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 陈敏
* @version Info.java, v 1.1 2021/11/15 10:16 chenmin Exp $
* Created on 2021/11/15
* OssInfo类用于封装OSSObject Storage Service对象的相关信息
* 通过此类可以方便地管理和访问OSS对象的元数据如名称路径大小等
*/
@Builder
@Data
public class OssInfo {
/**
* 名称
* 文件或对象的名称
* 用于唯一标识OSS中的一个对象
*/
private String name;
/**
* oss里的路径存储路径
* 文件在OSS中的存储路径
* 该路径不包含Bucket名称仅指对象在Bucket内的相对路径
*/
private String path;
/**
* 对象大小
* 文件或对象的大小
* 以字符串形式表示单位可能为字节KBMB等
*/
private String length;
/**
* 文件类型
* 文件的类型
* 可以是文件的MIME类型或者根据文件扩展名推测的类型
*/
private String fileType;
/**
* Bucket名称
**/
* 存储文件的Bucket名称
* Bucket是OSS中用于存储对象的容器每个对象必须属于某个Bucket
*/
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 操作结果
*/
R<T> delete(String ossFilePath);
/**
* 文件复制
*
* @param source 原oss文件存储地址
* @param path 目标oss文件存储地址
* @return 操作结果
*/
R<T> copy(String source, String path);
/**
* 多文件上传
*
* @param files 文件流数组
* @return 上传结果
* @param files 文件流
* @return 文件信息
*/
R<List<OssInfo>> uploadMultiple(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);
R<List<OssInfo>> uploadFiles(MultipartFile[] files);
}

View File

@ -2,9 +2,9 @@ package com.bonus.oss.service.impl;
import com.aliyun.oss.model.OSSObject;
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.service.OssService;
import com.bonus.oss.utils.FileUtils;
import com.bonus.oss.utils.OssUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.poi.ss.formula.functions.T;
@ -12,6 +12,7 @@ import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
@ -24,16 +25,16 @@ public class OssServiceImpl implements OssService {
/**
* 文件上传
*
* @param file 文件流
* @param multipartFile 文件流
* @return 文件信息
*/
@Override
public R<OssInfo> upload(MultipartFile file) {
public R<OssInfo> upload(MultipartFile multipartFile) {
try {
if (!FileUtils.isValidFile(file)) {
return R.fail("File is empty or File size exceeds 5GB!");
}
return ossUtils.upload(file);
String objectKey = multipartFile.getOriginalFilename();
File file = FileUtils.multipartFileToFile(multipartFile);
objectKey = FileUtils.generateObjectName(objectKey);
return ossUtils.upload(objectKey, file);
} catch (Exception e) {
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 文件流数组
* @return 上传结果
* @param files 文件流
* @return 文件信息
*/
@Override
public R<List<OssInfo>> uploadMultiple(MultipartFile[] files) {
List<OssInfo> uploadedFilesInfo = new ArrayList<>();
for (MultipartFile file : files) {
R<OssInfo> result = upload(file);
if (R.isError(result)) {
return R.fail("部分文件上传失败");
public R<List<OssInfo>> uploadFiles(MultipartFile[] files) {
try {
List<OssInfo> ossInfos = new ArrayList<>();
for (MultipartFile multipartFile : files) {
String objectKey = multipartFile.getOriginalFilename();
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对象
*/
public R<OssInfo> upload(MultipartFile param) {
// 获取上传文件的原始文件名
String originalFilename = param.getOriginalFilename();
// 将MultipartFile转换为File
File file = FileUtils.multipartFileToFile(param);
public R<OssInfo> upload(String objectKey, File file) {
try {
// 生成唯一的对象名
String objectName = FileUtils.generateObjectName(originalFilename);
// 上传文件到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) {
LOGGER.error("文件上传失败", e);
return R.fail("文件上传失败");
@ -76,21 +70,18 @@ public class OssUtils {
/**
* 获取文件信息
*
* @param filename 文件名
* @param ossFilePath 文件路径
* @return 包含文件信息的OssInfo对象
*/
public OssInfo getInfo(String filename, String ossFilePath) {
public OssInfo getInfo(String ossFilePath) {
try {
// 获取文件的元数据
ObjectMetadata objectMetadata = ossClient.getObjectMetadata(ossConfig.getBucket(), ossFilePath);
OssInfo ossInfo = new OssInfo();
// 设置文件信息
ossInfo.setLength(Convert.toStr(objectMetadata.getContentLength()));
ossInfo.setFileType(objectMetadata.getContentType());
ossInfo.setName(filename);
ossInfo.setBucketName(ossConfig.getBucket());
ossInfo.setPath(ossFilePath);
OssInfo ossInfo = OssInfo.builder()
.bucketName(ossConfig.getBucket())
.fileType(objectMetadata.getContentType())
.length(Convert.toStr(objectMetadata.getContentLength()))
.path(ossFilePath).build();
return ossInfo;
} catch (Exception e) {
LOGGER.error("获取文件信息失败", e);