Skip to content

Commit c8aca67

Browse files
committed
集成阿里云Oss对象存储.
1 parent d69ad8e commit c8aca67

File tree

11 files changed

+451
-5
lines changed

11 files changed

+451
-5
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ Demo列表:
6767
- [ApiBoot Security Oauth](https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-security-oauth-jwt)
6868
- [ApiBoot Swagger](https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-swagger)
6969
- [ApiBoot Http Converter](https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-http-converter)
70+
- [ApiBoot Alibaba Oss](https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-alibaba-oss)
7071

7172
## 版本管理规范
7273

api-boot-project/api-boot-plugins/api-boot-plugin-alibaba-oss/src/main/java/org/minbox/framework/api/boot/plugin/oss/ApiBootOssService.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,23 @@ public class ApiBootOssService implements ApiBootObjectStorageService {
2727
/**
2828
* 地域性的endpoint
2929
*/
30-
private String endpoint;
30+
protected String endpoint;
3131
/**
3232
* 存储空间名称
3333
*/
34-
private String bucketName;
34+
protected String bucketName;
3535
/**
3636
* 阿里云账号授权id
3737
*/
38-
private String accessKeyId;
38+
protected String accessKeyId;
3939
/**
4040
* 阿里云账号授权secret
4141
*/
42-
private String accessKeySecret;
42+
protected String accessKeySecret;
4343
/**
4444
* 自定义域名
4545
*/
46-
private String domain;
46+
protected String domain;
4747

4848
@Override
4949
public ApiBootObjectStorageResponse upload(String objectName, byte[] bytes) throws ApiBootObjectStorageException {

api-boot-project/api-boot-starters/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ ApiBoot`提供的所有封装依赖对应第三方框架关系如下所示:
88
| [api-boot-starter-http-converter](https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-http-converter) | 集成FastJson作为格式化返回JSON |
99
| [api-boot-starter-security-oauth-jwt](https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-security-oauth-jwt) | 集成SpringSecurity、Oauth、Jwt安全、认证框架 |
1010
| [api-boot-starter-swagger](https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-swagger) | 集成Swagger2作为接口服务文档 |
11+
| [api-boot-starter-alibaba-oss](https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-alibaba-oss) | 集成阿里云Oss对象存储接口服务 |
1112

1213

1314

api-boot-samples/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ Demo列表:
55
- [ApiBoot Security Oauth](https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-security-oauth-jwt)
66
- [ApiBoot Swagger](https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-swagger)
77
- [ApiBoot Http Converter](https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-http-converter)
8+
- [ApiBoot Alibaba Oss](https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-alibaba-oss)
89

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
## ApiBoot Alibaba Oss
2+
3+
`ApiBoot`添加快速集成`Aliyun`的对象存储服务`Oss`,提供常用的文件操作方法,当然也提供自定义扩展,以致于满足绝大数业务场景,并且通过扩展可以实现上传文件进度条、下载文件进度条、存储空间操作、静态网站托管、访问日志、防盗链、分片上传、追加上传、断点续传等等。
4+
5+
### 引入ApiBoot Alibaba Oss
6+
7+
`pom.xml`配置文件内添加依赖,如下所示:
8+
9+
```xml
10+
<!--ApiBoot Alibaba Oss-->
11+
<dependency>
12+
<groupId>org.minbox.framework</groupId>
13+
<artifactId>api-boot-starter-alibaba-oss</artifactId>
14+
</dependency>
15+
```
16+
17+
`ApiBoot`所提供的依赖都不需要添加版本号,具体查看[ApiBoot版本依赖](https://github.com/hengboy/api-boot/blob/master/README.md#%E6%B7%BB%E5%8A%A0%E7%89%88%E6%9C%AC%E4%BE%9D%E8%B5%96)
18+
19+
### 配置参数列表
20+
21+
| 配置参数 | 参数介绍 | 默认值 | 是否必填 |
22+
| -------------------------------- | ------------------------------------------------------------ | ------ | -------- |
23+
| `api.boot.oss.region` | oss所属地域 |||
24+
| `api.boot.oss.bucket-name` | oss存储空间名称 |||
25+
| `api.boot.oss.access-key-id` | 阿里云账户accessKeyId |||
26+
| `api.boot.oss.access-key-secret` | 阿里云账户accessKeySecret |||
27+
| `api.boot.oss.domain` | oss存储空间所绑定的自定义域名,如果不配置,上传文件成功后返回默认格式化的文件访问路径 |||
28+
29+
### 上传文件
30+
31+
在使用`ApiBoot Oss`时,只需要注入`ApiBootOssService`类就可以完成默认方法的使用,如下所示:
32+
33+
```java
34+
@Autowired
35+
private ApiBootOssService apiBootOssService;
36+
```
37+
38+
#### 流上传
39+
40+
```java
41+
/**
42+
* 流方式上传
43+
*/
44+
@Test
45+
public void uploadBytes() {
46+
ApiBootObjectStorageResponse response = apiBootOssService.upload("admin.txt", "admin".getBytes());
47+
logger.info("文件名称:{}", response.getObjectName());
48+
logger.info("文件访问路径:{}", response.getObjectUrl());
49+
}
50+
```
51+
52+
#### 本地文件上传
53+
54+
```java
55+
/**
56+
* 本地文件上传
57+
*/
58+
@Test
59+
public void uploadFile() {
60+
ApiBootObjectStorageResponse response = apiBootOssService.upload("logo.png", "/Users/yuqiyu/Downloads/logo.png");
61+
logger.info("文件名称:{}", response.getObjectName());
62+
logger.info("文件访问路径:{}", response.getObjectUrl());
63+
}
64+
```
65+
66+
#### 文件流上传
67+
68+
```java
69+
/**
70+
* 文件流方式上传
71+
*
72+
* @throws Exception
73+
*/
74+
@Test
75+
public void uploadInputStream() throws Exception {
76+
FileInputStream inputStream = new FileInputStream(new File("/Users/yuqiyu/Downloads/logo.png"));
77+
ApiBootObjectStorageResponse response = apiBootOssService.upload("测试.png", inputStream);
78+
logger.info("文件名称:{}", response.getObjectName());
79+
logger.info("文件访问路径:{}", response.getObjectUrl());
80+
}
81+
```
82+
83+
> 通过文件的输入流完成对象存储文件的上传
84+
85+
#### 下载文件
86+
87+
```java
88+
/**
89+
* 下载文件
90+
*/
91+
@Test
92+
public void download() {
93+
apiBootOssOverrideService.download("测试.png", "/Users/yuqiyu/Downloads/测试.png");
94+
}
95+
```
96+
97+
> 在上面的示例中,文件会自动下载到`/Users/yuqiyu/Downloads/`目录下,文件名称为`测试.png`
98+
99+
#### 删除文件
100+
101+
```java
102+
/**
103+
* 删除文件示例
104+
*/
105+
@Test
106+
public void delete() {
107+
apiBootOssOverrideService.delete("测试.png");
108+
}
109+
```
110+
111+
> 删除对象存储空间内的文件时只需要传递文件名即可。
112+
113+
#### MultipartFile 上传文件
114+
115+
如果你是通过`SpringMvc`提供的`MultipartFile`对象进行上传文件,可以通过如下示例进行上传:
116+
117+
```java
118+
MultipartFile multipartFile = ..;
119+
// 流方式上传
120+
ApiBootObjectStorageResponse responseByte = apiBootOssService.upload("测试.png", multipartFile.getBytes());
121+
// 文件输入流方式上传
122+
ApiBootObjectStorageResponse responseIs = apiBootOssService.upload("测试.png", multipartFile.getInputStream());
123+
```
124+
125+
126+
127+
### 自定义扩展
128+
129+
`ApiBoot Alibaba Oss`提供的方法毕竟是有限的,因此`ApiBoot`提供了自定义的扩展方式,让使用者可以根据`Oss`官方文档进行扩展,包含上传文件进度条、下载文件进度条、存储空间操作、静态网站托管、访问日志、防盗链、分片上传、追加上传、断点续传等等。
130+
131+
自定义扩展首先需要创建类并继承`ApiBootOssService`,如下所示:
132+
133+
```java
134+
//...
135+
public class ApiBootOssOverrideService extends ApiBootOssService {
136+
/**
137+
* logger instance
138+
*/
139+
static Logger logger = LoggerFactory.getLogger(ApiBootOssOverrideService.class);
140+
141+
/**
142+
* 实现父类构造函数
143+
*
144+
* @param endpoint 外网节点
145+
* @param bucketName 存储空间名称
146+
* @param accessKeyId 阿里云账号授权Id
147+
* @param accessKeySecret 阿里云账号授权Secret
148+
* @param domain 自定义域名
149+
*/
150+
public ApiBootOssOverrideService(String endpoint, String bucketName, String accessKeyId, String accessKeySecret, String domain) {
151+
super(endpoint, bucketName, accessKeyId, accessKeySecret, domain);
152+
}
153+
154+
/**
155+
* 创建bucket存储
156+
*
157+
* @param bucketName 存储名称
158+
*/
159+
public void createBucket(String bucketName) {
160+
OSSClient ossClient = getOssClient();
161+
Bucket bucket = ossClient.createBucket(bucketName);
162+
logger.info("新创建存储空间名称:{}", bucket.getName());
163+
logger.info("新创建存储空间所属人:{}", bucket.getOwner().getDisplayName());
164+
closeOssClient(ossClient);
165+
}
166+
}
167+
```
168+
169+
如上`createBucket`方法所示`ApiBootOssService`内部提供了获取`OssClient`以及关闭`OssClient`连接的方法,可以直接调用。
170+
171+
**扩展生效**
172+
173+
我们自定义的扩展,需要将实例放入`SpringIOC`容器内,方便我们在使用处进行注入,要注意,由于构造函数参数的原因,无法直接通过`@Service`或者`@Component`注解进行标注,需要通过如下方式:
174+
175+
```java
176+
//...
177+
@Bean
178+
@ConditionalOnMissingBean
179+
ApiBootOssOverrideService apiBootOssOverrideService(ApiBootOssProperties apiBootOssProperties) {
180+
return new ApiBootOssOverrideService(apiBootOssProperties.getRegion().getEndpoint(), apiBootOssProperties.getBucketName(), apiBootOssProperties.getAccessKeyId(), apiBootOssProperties.getAccessKeySecret(), apiBootOssProperties.getDomain());
181+
}
182+
```
183+
184+
`ApiBootOssProperties`属性配置类,是`ApiBoot`内置的,可以在任意地方进行注入,这里目的只是为了拿到相关配置进行构造参数实例化使用。
185+
186+
### v0.1.2.RELEASE规划
187+
188+
1. 上传、下载进度条监听
189+
2. 追加上传
190+
3. 分片上传
191+
4. 上传、下载断点续传
192+
5. 列举文件
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>api-boot-samples</artifactId>
7+
<groupId>org.minbox.framework</groupId>
8+
<version>0.1.1.RELEASE</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
<description>ApiBoot 集成阿里云Oss对象存储</description>
12+
<artifactId>api-boot-sample-alibaba-oss</artifactId>
13+
14+
<dependencies>
15+
<dependency>
16+
<groupId>org.springframework.boot</groupId>
17+
<artifactId>spring-boot-starter-test</artifactId>
18+
</dependency>
19+
20+
<!--ApiBoot Alibaba Oss-->
21+
<dependency>
22+
<groupId>org.minbox.framework</groupId>
23+
<artifactId>api-boot-starter-alibaba-oss</artifactId>
24+
</dependency>
25+
</dependencies>
26+
27+
<!--ApiBoot版本依赖-->
28+
<dependencyManagement>
29+
<dependencies>
30+
<dependency>
31+
<groupId>org.minbox.framework</groupId>
32+
<artifactId>api-boot-dependencies</artifactId>
33+
<version>0.1.1.RELEASE</version>
34+
<type>pom</type>
35+
<scope>import</scope>
36+
</dependency>
37+
</dependencies>
38+
</dependencyManagement>
39+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.minbox.framework.api.boot.sample;
2+
3+
import com.aliyun.oss.OSSClient;
4+
import com.aliyun.oss.model.Bucket;
5+
import org.minbox.framework.api.boot.plugin.oss.ApiBootOssService;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
9+
/**
10+
* 自定义扩展Oss Service
11+
* @author:恒宇少年 - 于起宇
12+
* <p>
13+
* DateTime:2019-03-22 10:00
14+
* Blog:http://blog.yuqiyu.com
15+
* WebSite:http://www.jianshu.com/u/092df3f77bca
16+
* Gitee:https://gitee.com/hengboy
17+
* GitHub:https://github.com/hengyuboy
18+
*/
19+
public class ApiBootOssOverrideService extends ApiBootOssService {
20+
/**
21+
* logger instance
22+
*/
23+
static Logger logger = LoggerFactory.getLogger(ApiBootOssOverrideService.class);
24+
25+
/**
26+
* 实现父类构造函数
27+
*
28+
* @param endpoint 外网节点
29+
* @param bucketName 存储空间名称
30+
* @param accessKeyId 阿里云账号授权Id
31+
* @param accessKeySecret 阿里云账号授权Secret
32+
* @param domain 自定义域名
33+
*/
34+
public ApiBootOssOverrideService(String endpoint, String bucketName, String accessKeyId, String accessKeySecret, String domain) {
35+
super(endpoint, bucketName, accessKeyId, accessKeySecret, domain);
36+
}
37+
38+
/**
39+
* 创建bucket存储
40+
*
41+
* @param bucketName 存储名称
42+
*/
43+
public void createBucket(String bucketName) {
44+
OSSClient ossClient = getOssClient();
45+
Bucket bucket = ossClient.createBucket(bucketName);
46+
logger.info("新创建存储空间名称:{}", bucket.getName());
47+
logger.info("新创建存储空间所属人:{}", bucket.getOwner().getDisplayName());
48+
closeOssClient(ossClient);
49+
}
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.minbox.framework.api.boot.sample;
2+
3+
import org.minbox.framework.api.boot.autoconfigure.oss.ApiBootOssProperties;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
import org.springframework.boot.SpringApplication;
7+
import org.springframework.boot.autoconfigure.SpringBootApplication;
8+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
9+
import org.springframework.context.annotation.Bean;
10+
11+
/**
12+
* ApiBoot Sample Oss
13+
*
14+
* @author:恒宇少年 - 于起宇
15+
* <p>
16+
* DateTime:2019-03-21 17:06
17+
* Blog:http://blog.yuqiyu.com
18+
* WebSite:http://www.jianshu.com/u/092df3f77bca
19+
* Gitee:https://gitee.com/hengboy
20+
* GitHub:https://github.com/hengyuboy
21+
*/
22+
@SpringBootApplication
23+
public class ApiBootOssSampleApplication {
24+
/**
25+
* logger instance
26+
*/
27+
static Logger logger = LoggerFactory.getLogger(ApiBootOssSampleApplication.class);
28+
29+
public static void main(String[] args) {
30+
SpringApplication.run(ApiBootOssSampleApplication.class, args);
31+
logger.info("「「「「「ApiBoot Oss Sample 启动成功.」」」」」");
32+
}
33+
34+
/**
35+
* 将自定义Oss Service 放入Spring Ioc
36+
*
37+
* @param apiBootOssProperties oss属性配置类
38+
* @return
39+
*/
40+
@Bean
41+
@ConditionalOnMissingBean
42+
ApiBootOssOverrideService apiBootOssOverrideService(ApiBootOssProperties apiBootOssProperties) {
43+
return new ApiBootOssOverrideService(apiBootOssProperties.getRegion().getEndpoint(), apiBootOssProperties.getBucketName(), apiBootOssProperties.getAccessKeyId(), apiBootOssProperties.getAccessKeySecret(), apiBootOssProperties.getDomain());
44+
}
45+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
spring:
2+
application:
3+
name: api-boot-sample-alibaba-oss
4+
api:
5+
boot:
6+
oss:
7+
# oss存储地域
8+
region: beijing
9+
# id
10+
access-key-id: xxxx
11+
# secret
12+
access-key-secret: xxxx
13+
# 存储空间名称
14+
bucket-name: xxx
15+
# oss所绑定的域名
16+
#domain: http://xxx.xxx.xx

0 commit comments

Comments
 (0)