- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章SpringBoot整合阿里云OSS对象存储服务的实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
今天来整合一下SpringBoot和阿里云OSS对象存储服务.
1、配置OSS服务 。
先在阿里云开通对象存储服务,拿到AccessKeyId、AccessKeySecret.
创建你的bucket(存储空间),相当于一个一个的文件夹目录。按业务需求分类存储你的文件,图片,音频,app包等等。创建bucket是要选择该bucket的权限,私有,公共读,公共读写,按需求选择。创建bucket时对应的endpoint要记住,上传文件需要用到.
可以配置bucket的生命周期,比如说某些文件有过期时间的,可以配置一下.
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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
前言 这个东西有啥用,好玩? 确实, 好玩归好玩,其实很有使用场景。 可以自己选则一些业务节点触发这个机器人助手的消息推送; 简单举例: 有人给你的系统留下反馈意见了,推送到运营群去; 2.项目部署成
1. JWT 简介 JSON Web Token(JWT) 是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信
我的页面上有多个 ajax 调用,我想将它们合并为一个函数。 目前我在几个地方都有这种类型的功能: function AjaxCallOne () { //do something $.ajax(
我的 Facebook 集成基本上可以在我的应用程序中运行:出现 Facebook 对话框,用户可以选择“允许”或“不允许”。但是,我不明白 API 是如何工作的!我有一个使用此代码的 Activit
我必须将文件夹结构从我的应用程序共享到 OneDrive。 我已经检查了一个驱动器的 sdk,但在那个 sdk 中只能共享文件而不是文件夹,并且没有在该 sdk 中创建文件夹的选项 https://g
我是支付网关集成方面的新手。我必须在我的项目 (CORE PHP) 中集成 CCAvenue 支付网关集成。但是我不知道如何为开发人员测试创建商户帐户,如何获取商户 key 等。我已经进行了研发,但是
我正在尝试将“社交选项”集成到我的应用程序中。 我有 iOS6,但我的想法是有一个适用于 iOS5 的应用程序。使用 Twitter 框架非常简单,并且可以在 r.0 版本和 6.0 版本的设备上运行
我正在尝试将 flurryAds 集成到我的 iPhone 应用程序中,但我无法做到这一点。我导入名为 的 .h 文件 #import "Flurry.h" #import "FlurryAds.h"
我正在尝试在我的网站中实现类似 facebook 的按钮和评论,但我在 IE7 中遇到了评论框问题。 COMMENT USING 下拉框不知何故没有显示其他可用选项。这是我用来实现它的代码片段:
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve th
我正在使用 SOAP API 进行 PayPal 集成(Express Checkout)。在 DoExpressCheckout 调用后,我调用 GetExpressCheckoutDetails。
我正在尝试将 paypal 作为支付网关之一集成到我的应用程序中,但在我点击支付按钮后它会返回以下错误。 错误 java.lang.RuntimeException:无法使用 Intent { cmp
我目前正在尝试将 paypal 结账与我们的在线商店集成。我们正在针对 Sandbox 进行测试。除了 IPN(即时付款通知)之外的所有内容都有效。 我们阅读了很多有关 Paypal 更改其安全模型的
我正在开发一个 android 应用程序,我想在其中集成 facebook 之类的。我正在浏览链接 http://developers.facebook.com/docs/guides/mobile/
所以我正在尝试构建一个集成了 FitBit 的 iOS 应用程序 (Swift 2)。 一旦用户打开“步行”页面,用户应该能够看到他每天的步数。 理想情况下,我们不希望每个用户都注册到 FitBit。
我是集成投递箱的新手,但我不太确定如何生成调用以获取请求 token secret 。 https://www.dropbox.com/developers/reference/api#request
我已经成功集成了 PayPal。一切正常。但我希望我的表格在成功付款后重定向到我的网站。另一个问题:如何从 PayPal 得到回应?这是我的 Paypal 表格。谢谢。 `
我在我的 Android 应用程序中集成了 Paypal 。我有一个主要 Activity - 和关于 Activity ,我在其中显示 Paypal 按钮。关于从主 Activity 访问的 Act
前言: 小编引入的图片和文字描述都是来自于尚硅谷的视频讲解,在此感谢尚硅谷的老师,同时也结合 seata文档官方文档进行整合 项目地址(gitee): https://gitee.com/qine
目录 1. demo project 1.1 接口准备 1.2 配置准备 2. docker 开启远程连接
我是一名优秀的程序员,十分优秀!