一、准备工作
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
| <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>
<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>
<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
|
公共云下 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;
@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(); }
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) {
OSS ossClient = new OSSClientBuilder().build( OssProperties.ENDPOINT, OssProperties.KEY_ID, OssProperties.KEY_SECRET);
if(!ossClient.doesBucketExist(OssProperties.BUCKET_NAME)){ ossClient.createBucket(OssProperties.BUCKET_NAME); ossClient.setBucketAcl(OssProperties.BUCKET_NAME, CannedAccessControlList.PublicRead); }
String folder = new DateTime().toString("yyyy/MM/dd");
String filenameExtension = StringUtils.getFilenameExtension(fileName); fileName = UUID.randomUUID().toString() + "." + filenameExtension;
String key = module + "/" + folder + "/" + fileName;
ossClient.putObject(OssProperties.BUCKET_NAME, key, inputStream);
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
|
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
|
@Override public void removeFile(String url) {
OSS ossClient = new OSSClientBuilder().build( OssProperties.ENDPOINT, OssProperties.KEY_ID, OssProperties.KEY_SECRET);
String host = "https://" + OssProperties.BUCKET_NAME + "." + OssProperties.ENDPOINT + "/";
String objectName = url.substring(host.length());
ossClient.deleteObject(OssProperties.BUCKET_NAME, objectName);
ossClient.shutdown(); }
|