oss文件存储服务
This commit is contained in:
parent
d86ddfaefe
commit
f9b6ffa9cc
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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类用于封装OSS(Object Storage Service)对象的相关信息。
|
||||
* 通过此类,可以方便地管理和访问OSS对象的元数据,如名称、路径、大小等。
|
||||
*/
|
||||
|
||||
@Builder
|
||||
@Data
|
||||
public class OssInfo {
|
||||
/**
|
||||
* 名称
|
||||
* 文件或对象的名称。
|
||||
* 用于唯一标识OSS中的一个对象。
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* oss里的路径存储路径
|
||||
* 文件在OSS中的存储路径。
|
||||
* 该路径不包含Bucket名称,仅指对象在Bucket内的相对路径。
|
||||
*/
|
||||
private String path;
|
||||
|
||||
/**
|
||||
* 对象大小
|
||||
* 文件或对象的大小。
|
||||
* 以字符串形式表示,单位可能为字节、KB、MB等。
|
||||
*/
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue