ApiBoot是一款基于SpringBoot1.x,2.x的接口服務內建基礎架構, 内部提供了架構的封裝內建、使用擴充、自動化完成配置,讓接口開發者可以選着性完成開箱即用, 不再為搭建接口架構而犯愁,進而極大的提高開發效率。
`ApiBoot`添加快速內建`Aliyun`的對象存儲服務`Oss`,提供常用的檔案操作方法,當然也提供自定義擴充,以緻于滿足絕大數業務場景,并且通過擴充可以實作上傳檔案進度條、下載下傳檔案進度條、存儲空間操作、靜态網站托管、通路日志、防盜鍊、分片上傳、追加上傳、斷點續傳等等。
### 引入ApiBoot Alibaba Oss
在`pom.xml`配置檔案内添加依賴,如下所示:
```xml
org.minbox.frameworkapi-boot-starter-alibaba-oss
```
`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)
### 配置參數清單
| 配置參數 | 參數介紹 | 預設值 | 是否必填 |
| -------------------------------- | ------------------------------------------------------------ | ------ | -------- |
| `api.boot.oss.region` | oss所屬地域 | 空 | 是 |
| `api.boot.oss.bucket-name` | oss存儲空間名稱 | 空 | 是 |
| `api.boot.oss.access-key-id` | 阿裡雲賬戶accessKeyId | 空 | 是 |
| `api.boot.oss.access-key-secret` | 阿裡雲賬戶accessKeySecret | 空 | 是 |
| `api.boot.oss.domain` | oss存儲空間所綁定的自定義域名,如果不配置,上傳檔案成功後傳回預設格式化的檔案通路路徑 | 空 | 否 |
### 上傳檔案
在使用`ApiBoot Oss`時,隻需要注入`ApiBootOssService`類就可以完成預設方法的使用,如下所示:
```java
@Autowired
private ApiBootOssService apiBootOssService;
#### 流上傳
/**
* 流方式上傳
*/
@Test
public void uploadBytes() {
ApiBootObjectStorageResponse response = apiBootOssService.upload("admin.txt", "admin".getBytes());
logger.info("檔案名稱:{}", response.getObjectName());
logger.info("檔案通路路徑:{}", response.getObjectUrl());
}
#### 本地檔案上傳
* 本地檔案上傳
*/
public void uploadFile() {
ApiBootObjectStorageResponse response = apiBootOssService.upload("logo.png", "/Users/yuqiyu/Downloads/logo.png");
logger.info("檔案名稱:{}", response.getObjectName());
logger.info("檔案通路路徑:{}", response.getObjectUrl());
#### 檔案流上傳
* 檔案流方式上傳
*
* @throws Exception
public void uploadInputStream() throws Exception {
FileInputStream inputStream = new FileInputStream(new File("/Users/yuqiyu/Downloads/logo.png"));
ApiBootObjectStorageResponse response = apiBootOssService.upload("測試.png", inputStream);
> 通過檔案的輸入流完成對象存儲檔案的上傳
#### 下載下傳檔案
* 下載下傳檔案
public void download() {
apiBootOssOverrideService.download("測試.png", "/Users/yuqiyu/Downloads/測試.png");
> 在上面的示例中,檔案會自動下載下傳到`/Users/yuqiyu/Downloads/`目錄下,檔案名稱為`測試.png`。
#### 删除檔案
* 删除檔案示例
public void delete() {
apiBootOssOverrideService.delete("測試.png");
> 删除對象存儲空間内的檔案時隻需要傳遞檔案名即可。
#### MultipartFile 上傳檔案
如果你是通過`SpringMvc`提供的`MultipartFile`對象進行上傳檔案,可以通過如下示例進行上傳:
MultipartFile multipartFile = ..;
// 流方式上傳
ApiBootObjectStorageResponse responseByte = apiBootOssService.upload("測試.png", multipartFile.getBytes());
// 檔案輸入流方式上傳
ApiBootObjectStorageResponse responseIs = apiBootOssService.upload("測試.png", multipartFile.getInputStream());
### 自定義擴充
`ApiBoot Alibaba Oss`提供的方法畢竟是有限的,是以`ApiBoot`提供了自定義的擴充方式,讓使用者可以根據`Oss`官方文檔進行擴充,包含上傳檔案進度條、下載下傳檔案進度條、存儲空間操作、靜态網站托管、通路日志、防盜鍊、分片上傳、追加上傳、斷點續傳等等。
自定義擴充首先需要建立類并繼承`ApiBootOssService`,如下所示:
//...
public class ApiBootOssOverrideService extends ApiBootOssService {
/**
* logger instance
*/
static Logger logger = LoggerFactory.getLogger(ApiBootOssOverrideService.class);
* 實作父類構造函數
*
* @param endpoint 外網節點
* @param bucketName 存儲空間名稱
* @param accessKeyId 阿裡雲賬号授權Id
* @param accessKeySecret 阿裡雲賬号授權Secret
* @param domain 自定義域名
public ApiBootOssOverrideService(String endpoint, String bucketName, String accessKeyId, String accessKeySecret, String domain) {
super(endpoint, bucketName, accessKeyId, accessKeySecret, domain);
}
* 建立bucket存儲
* @param bucketName 存儲名稱
public void createBucket(String bucketName) {
OSSClient ossClient = getOssClient();
Bucket bucket = ossClient.createBucket(bucketName);
logger.info("新建立存儲空間名稱:{}", bucket.getName());
logger.info("新建立存儲空間所屬人:{}", bucket.getOwner().getDisplayName());
closeOssClient(ossClient);
如上`createBucket`方法所示`ApiBootOssService`内部提供了擷取`OssClient`以及關閉`OssClient`連接配接的方法,可以直接調用。
**擴充生效**
我們自定義的擴充,需要将執行個體放入`SpringIOC`容器内,友善我們在使用處進行注入,要注意,由于構造函數參數的原因,無法直接通過`@Service`或者`@Component`注解進行标注,需要通過如下方式:
@Bean
@ConditionalOnMissingBean
ApiBootOssOverrideService apiBootOssOverrideService(ApiBootOssProperties apiBootOssProperties) {
return new ApiBootOssOverrideService(apiBootOssProperties.getRegion().getEndpoint(), apiBootOssProperties.getBucketName(), apiBootOssProperties.getAccessKeyId(), apiBootOssProperties.getAccessKeySecret(), apiBootOssProperties.getDomain());
`ApiBootOssProperties`屬性配置類,是`ApiBoot`内置的,可以在任意地方進行注入,這裡目的隻是為了拿到相關配置進行構造參數執行個體化使用。
本章源碼位址:[https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-alibaba-oss](https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-alibaba-oss)
