一、准备工作

1、开发文档

阿里云对象存储 OSS API 文档:API 文档

阿里云对象存储 OSS 开发文档:开发文档

阿里云对象存储 OSS Java SDK:Java SDK

2、依赖项

创建 SpringBoot 项目

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
<!--阿里云OSS-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>

<!--日期时间工具-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>

<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>

<!--lombok用来简化实体类:需要安装lombok插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

3、配置信息

配置 application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server:
port: 8130 # 服务端口

spring:
profiles:
active: dev # 环境设置
application:
name: service-oss # 服务名

aliyun:
oss:
endpoint: 阿里云endponit
keyId: 阿里云keyid
keySecret: 阿里云keysecret
bucketName: 阿里云bucketName #bucket可以在阿里云控制台创建,也可以使用java代码创建

公共云下 OSS Region 和 Endpoint 对照表:访问域名和数据中心

4、配置 swagger

可以参照:编写 Swagger2Config 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
@EnableSwagger2
public class Swagger2Config {

@Bean
public Docket apiConfig() {

return new Docket(DocumentationType.SWAGGER_2)
.groupName("adminApi")
.select()
.paths(Predicates.and(PathSelectors.regex("/api/.*")))
.build();
}
}

二、实现文件上传

1、从配置文件读取常量

创建常量读取工具类:OssProperties.java,用来从application.yml中读取配置信息

InitializingBean接口为 bean 提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化 bean 的时候都会执行该方法。

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
@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class OssProperties implements InitializingBean {
private String endpoint;
private String keyId;
private String keySecret;
private String bucketName;

public static String ENDPOINT;
public static String KEY_ID;
public static String KEY_SECRET;
public static String BUCKET_NAME;

/**
* 当私有成员被赋值后,此方法自动被调用,从而初始化常量
*
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
ENDPOINT = endpoint;
KEY_ID = keyId;
KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}

2、控制层

FileController.java

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
@Api(tags = "阿里云文件管理")
@CrossOrigin //跨域
@RestController
@RequestMapping("/api/oss/file")
public class FileController {

@Resource
private FileService fileService;

/**
* 文件上传
*/
@ApiOperation("文件上传")
@PostMapping("/upload")
public String upload(
@ApiParam(value = "文件", required = true)
@RequestParam("file") MultipartFile file,

@ApiParam(value = "模块", required = true)
@RequestParam("module") String module) {


String uploadUrl = null;
try {
InputStream inputStream = file.getInputStream();
String originalFilename = file.getOriginalFilename();
uploadUrl = fileService.upload(inputStream, module, originalFilename);
} catch (IOException e) {
e.printStackTrace();
}

// 返回URL地址
return uploadUrl;

}
}

3、实现文件上传业务

创建 Service 接口:FileService.java

1
2
3
4
5
6
7
public interface FileService {

/**
* 文件上传至阿里云
*/
String upload(InputStream inputStream, String module, String fileName);
}

实现:FileServiceImpl.java

官方文档:简单上传

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
@Service
public class FileServiceImpl implements FileService {

/**
* 文件上传至阿里云
*/
@Override
public String upload(InputStream inputStream, String module, String fileName) {

// 创建OSSClient实例
OSS ossClient = new OSSClientBuilder().build(
OssProperties.ENDPOINT,
OssProperties.KEY_ID,
OssProperties.KEY_SECRET);

// 判断oss实例是否存在:如果不存在则创建,如果存在则获取
if(!ossClient.doesBucketExist(OssProperties.BUCKET_NAME)){
// 创建bucket
ossClient.createBucket(OssProperties.BUCKET_NAME);
// 设置oss实例的访问权限:公共读
ossClient.setBucketAcl(OssProperties.BUCKET_NAME, CannedAccessControlList.PublicRead);
}

//构建日期路径:2021/07/07
String folder = new DateTime().toString("yyyy/MM/dd");

// 文件名:uuid.扩展名
// 获取文件后缀
String filenameExtension = StringUtils.getFilenameExtension(fileName);
// 拼接:uuid+.+文件后缀
fileName = UUID.randomUUID().toString() + "." + filenameExtension;

// 文件储存根路径:即文件夹名+日期路径+文件名
String key = module + "/" + folder + "/" + fileName;

// 文件上传至阿里云
// 依次填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
ossClient.putObject(OssProperties.BUCKET_NAME, key, inputStream);

// 关闭OSSClient。
ossClient.shutdown();

// 返回上传的文件的直链
return "https://" + OssProperties.BUCKET_NAME + "." + OssProperties.ENDPOINT + "/" + key;
}
}

三、实现文件删除

1、控制层

FileController.java

1
2
3
4
5
6
7
8
@ApiOperation("删除OSS文件")
@DeleteMapping("/remove")
public String remove(
@ApiParam(value = "要删除的文件路径", required = true)
@RequestParam("url") String url) {
fileService.removeFile(url);
return "删除成功";
}

2、实现文件删除业务

Service 接口:FileService.java

1
2
3
4
5
/**
* 根据路径删除文件
* @param url 阿里云上图片的直链路径
*/
void removeFile(String url);

实现:FileServiceImpl.java

官方文档:删除文件

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
/**
* 根据路径删除文件
* @param url
*/
@Override
public void removeFile(String url) {

// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(
OssProperties.ENDPOINT,
OssProperties.KEY_ID,
OssProperties.KEY_SECRET);

// 阿里云OSS上的文件路径前缀:https://BUCKET_NAME.ENDPOINT/
String host = "https://" + OssProperties.BUCKET_NAME + "." + OssProperties.ENDPOINT + "/";

// 从传入的完整url上截取出文件的路径部分:3/2021/07/07/d86f2185-8dbd-42d0-9c55-c9d881314e64.jpg
String objectName = url.substring(host.length());

// 只删除文件,不删除路径
ossClient.deleteObject(OssProperties.BUCKET_NAME, objectName);

// 关闭OSSClient。
ossClient.shutdown();
}