gpt4 book ai didi

SpringBoot整合阿里云OSS对象存储服务的实现

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 28 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章SpringBoot整合阿里云OSS对象存储服务的实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

今天来整合一下SpringBoot和阿里云OSS对象存储服务.

1、配置OSS服务 。

先在阿里云开通对象存储服务,拿到AccessKeyId、AccessKeySecret.

SpringBoot整合阿里云OSS对象存储服务的实现

创建你的bucket(存储空间),相当于一个一个的文件夹目录。按业务需求分类存储你的文件,图片,音频,app包等等。创建bucket是要选择该bucket的权限,私有,公共读,公共读写,按需求选择。创建bucket时对应的endpoint要记住,上传文件需要用到.

SpringBoot整合阿里云OSS对象存储服务的实现

可以配置bucket的生命周期,比如说某些文件有过期时间的,可以配置一下.

SpringBoot整合阿里云OSS对象存储服务的实现

2、代码实现 。

引入依赖包 。

?
1
2
3
4
5
< dependency >
   < groupId >com.aliyun.oss</ groupId >
   < artifactId >aliyun-sdk-oss</ artifactId >
   < version >2.8.3</ version >
</ dependency >

配置文件application.yml 。

?
1
2
3
4
5
6
7
8
aliyun-oss:
  #bucket名称
  bucketApp: xxx-app
  domainApp: https://xxx-app.oss-cn-shenzhen.aliyuncs.com/
  region: oss-cn-shenzhen
  endpoint : https://oss-cn-shenzhen.aliyuncs.com
  accessKeyId: 你的accessKeyId
  accessKeySecret: 你的accessKeySecret

对应上面配置文件的properties类 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.example.file.config;
 
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
@Component
@ConfigurationProperties (prefix = "aliyun-oss" )
@Data
public class AliyunOSSProperties {
 
   /**
    * 服务器地点
    */
   private String region;
   /**
    * 服务器地址
    */
   private String endpoint;
   /**
    * OSS身份id
    */
   private String accessKeyId;
   /**
    * 身份密钥
    */
   private String accessKeySecret;
 
   /**
    * App文件bucketName
    */
   private String bucketApp;
   /**
    * App包文件地址前缀
    */
   private String domainApp;
}

上传文件工具类 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
package com.example.file.utils;
 
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import com.example.common.exception.BusinessErrorCode;
import com.example.common.exception.BusinessException;
import com.example.common.utils.FileIdUtils;
import com.example.file.config.AliyunOSSProperties;
import com.example.file.config.FileTypeEnum;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
 
@Component
public class AliyunOSSUtil {
 
   @Autowired
   private AliyunOSSProperties aliyunOSSProperties;
 
   private static Logger logger = LoggerFactory.getLogger(AliyunOSSUtil. class );
 
   /**
    * 文件不存在
    */
   private final String NO_SUCH_KEY = "NoSuchKey" ;
   /**
    * 存储空间不存在
    */
   private final String NO_SUCH_BUCKET = "NoSuchBucket" ;
 
   /**
    * 上传文件到阿里云 OSS 服务器
    *
    * @param files
    * @param fileTypeEnum
    * @param bucketName
    * @param storagePath
    * @return
    */
   public List<String> uploadFile(MultipartFile[] files, FileTypeEnum fileTypeEnum, String bucketName, String storagePath, String prefix) {
     //创建OSSClient实例
     OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());
     List<String> fileIds = new ArrayList<>();
     try {
       for (MultipartFile file : files) {
             //创建一个唯一的文件名,类似于id,就是保存在OSS服务器上文件的文件名(自定义文件名)
         String fileName = FileIdUtils.creater(fileTypeEnum.getCode());
         InputStream inputStream = file.getInputStream();
         ObjectMetadata objectMetadata = new ObjectMetadata();
         //设置数据流里有多少个字节可以读取
         objectMetadata.setContentLength(inputStream.available());
         objectMetadata.setCacheControl( "no-cache" );
         objectMetadata.setHeader( "Pragma" , "no-cache" );
         objectMetadata.setContentType(file.getContentType());
         objectMetadata.setContentDisposition( "inline;filename=" + fileName);
         fileName = StringUtils.isNotBlank(storagePath) ? storagePath + "/" + fileName : fileName;
         //上传文件
         PutObjectResult result = ossClient.putObject(bucketName, fileName, inputStream, objectMetadata);
         logger.info( "Aliyun OSS AliyunOSSUtil.uploadFileToAliyunOSS,result:{}" , result);
         fileIds.add(prefix + fileName);
       }
     } catch (IOException e) {
       logger.error( "Aliyun OSS AliyunOSSUtil.uploadFileToAliyunOSS fail,reason:{}" , e);
     } finally {
       ossClient.shutdown();
     }
     return fileIds;
   }
 
   /**
    * 删除文件
    *
    * @param fileName
    * @param bucketName
    */
   public void deleteFile(String fileName, String bucketName) {
     OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());
     ossClient.deleteObject(bucketName, fileName);
     shutdown(ossClient);
   }
 
   /**
    * 根据图片全路径删除就图片
    *
    * @param imgUrl   图片全路径
    * @param bucketName 存储路径
    */
   public void delImg(String imgUrl, String bucketName) {
     if (StringUtils.isBlank(imgUrl)) {
       return ;
     }
     //问号
     int index = imgUrl.indexOf( '?' );
     if (index != - 1 ) {
       imgUrl = imgUrl.substring( 0 , index);
     }
     int slashIndex = imgUrl.lastIndexOf( '/' );
     String fileId = imgUrl.substring(slashIndex + 1 );
     OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());
     ossClient.deleteObject(bucketName, fileId);
     shutdown(ossClient);
   }
 
   /**
    * 判断文件是否存在
    *
    * @param fileName  文件名称
    * @param bucketName 文件储存空间名称
    * @return true:存在,false:不存在
    */
   public boolean doesObjectExist(String fileName, String bucketName) {
     Validate.notEmpty(fileName, "fileName can be not empty" );
     Validate.notEmpty(bucketName, "bucketName can be not empty" );
     OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());
     try {
       boolean found = ossClient.doesObjectExist(bucketName, fileName);
       return found;
     } finally {
       shutdown(ossClient);
     }
 
   }
 
   /**
    * 复制文件
    *
    * @param fileName       源文件名称
    * @param bucketName      源储存空间名称
    * @param destinationBucketName 目标储存空间名称
    * @param destinationObjectName 目标文件名称
    */
   public void ossCopyObject(String fileName, String bucketName, String destinationBucketName, String destinationObjectName) {
     Validate.notEmpty(fileName, "fileName can be not empty" );
     Validate.notEmpty(bucketName, "bucketName can be not empty" );
     Validate.notEmpty(destinationBucketName, "destinationBucketName can be not empty" );
     Validate.notEmpty(destinationObjectName, "destinationObjectName can be not empty" );
     OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());
     // 拷贝文件。
     try {
       ossClient.copyObject(bucketName, fileName, destinationBucketName, destinationObjectName);
     } catch (OSSException oe) {
       logger.error( "errorCode:{},Message:{},requestID:{}" , oe.getErrorCode(), oe.getMessage(), oe.getRequestId());
       if (oe.getErrorCode().equals(NO_SUCH_KEY)) {
         throw new BusinessException(BusinessErrorCode.NO_SUCH_KEY);
       } else if (oe.getErrorCode().equals(NO_SUCH_BUCKET)) {
         throw new BusinessException(BusinessErrorCode.NO_SUCH_BUCKET);
       } else {
         throw new BusinessException(BusinessErrorCode.FAIL);
       }
     } finally {
       shutdown(ossClient);
     }
   }
 
   /**
    * 关闭oos
    *
    * @param ossClient ossClient
    */
   private void shutdown(OSSClient ossClient) {
     ossClient.shutdown();
   }
}

文件类型枚举 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.example.file.config;
 
public enum FileTypeEnum {
 
   IMG( 1 , "图片" ),
   AUDIO( 2 , "音频" ),
   VIDEO( 3 , "视频" ),
   APP( 4 , "App包" ),
   OTHER( 5 , "其他" );
 
   private Integer code;
   private String message;
 
   FileTypeEnum(Integer code, String message) {
     this .code = code;
     this .message = message;
   }
 
   public Integer getCode() {
     return code;
   }
 
   public String getMessage() {
     return message;
   }
 
}

调用工具类上传文件 。

?
1
2
3
4
5
6
7
8
9
10
11
12
@Override
   public List<String> uploadImg(MultipartFile[] files) {
     if (files == null ) {
       throw new BusinessException(BusinessErrorCode.OPT_UPLOAD_FILE);
     }
     try {
       return aliyunOSSUtil.uploadFile(files, FileTypeEnum.IMG, aliyunOSSProperties.getBucketProduct(), null , aliyunOSSProperties.getDomainProduct());
     } catch (Exception e) {
       logger.error( "uploadImg error e:{}" , e);
       throw new BusinessException(BusinessErrorCode.UPLOAD_FAIL);
     }
   }

返回的List是文件上传之后文件的文件名集合。 到此就整合完成了。可以登录OSS控制台查看对应的文件。更多相关SpringBoot整合阿里云OSS内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://blog.csdn.net/Axela30W/article/details/96107452 。

最后此篇关于SpringBoot整合阿里云OSS对象存储服务的实现的文章就讲到这里了,如果你想了解更多关于SpringBoot整合阿里云OSS对象存储服务的实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com