|
| 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. 列举文件 |
0 commit comments