今天來整合一下SpringBoot和阿里云OSS對象存儲服務。
一、配置OSS服務
先在阿里云開通對象存儲服務,拿到AccessKeyId、AccessKeySecret。
創建你的bucket(存儲空間),相當于一個一個的文件夾目錄。按業務需求分類存儲你的文件,圖片,音頻,app包等等。創建bucket是要選擇該bucket的權限,私有,公共讀,公共讀寫,按需求選擇。創建bucket時對應的endpoint要記住,上傳文件需要用到。
可以配置bucket的生命周期,比如說某些文件有過期時間的,可以配置一下。
二、代碼實現
引入依賴包
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 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