文章目錄
華爲雲的obs如果自己調用api的話,接口太多,很多不需要,依賴也很多(需要調用好幾個jar包)。於是想着自己給封裝下,引一個jar就能用多好啊。於是自己利用業餘時間自定義了這個starer,可以快速投入開發,省時省力,希望幫助到大家。
一、自定義的starter封裝好的幾個常用方法:
一.桶的操作
- 查詢所有桶
- 桶的新增
- 桶的刪除
- 設置桶內文件對象過期時間
二.對象的操作
- 1.查詢某個桶的所有對象
- 2.上傳某個對象(全局訪問權限版2個)(通過流+通過file對象)
- 3.上傳某個對象(設置對象自定義元數據版)
- 4.獲取某個對象的所有信息
- 5.獲取某個對象的元數據
- 6.獲取某個對象的流
- 7.拷貝對象
- 8.刪除單個對象
- 9.下載某個對象到本地
三.文件夾的操作
- 1.創建文件夾
- 2.判斷對象是否是文件夾
- 3.列舉文件夾中的所有對象
- 4.刪除某個文件夾下的所有對象
二、springboot(華爲雲的obs)的starter核心工具類代碼
/**
* Title: ObsUtils
* Description: obs操作工具類
*
* @author hfl
* @version V1.0
* @date 2020-05-27
*/
public class ObsService {
private final static Logger logger = LoggerFactory.getLogger(ObsService.class);
private ObsClient obsClient;
private String bucketName;
private String bucketLoc;
private ObsConfiguration config;
public ObsService() {
}
public ObsService(String bucketName, String bucketLoc, ObsConfiguration config) {
this.bucketName = bucketName;
this.bucketLoc = bucketLoc;
this.config = config;
}
/**
* 查詢所有桶
*
* @return 桶的列表
*/
@ObsClientAnnotation
public List<ObsBucket> listBuckets() {
ListBucketsRequest request = new ListBucketsRequest();
request.setQueryLocation(true);
List<ObsBucket> obsBuckets = obsClient.listBuckets(request);
return obsBuckets;
}
/**
* 桶的新增
*
* @param bucketName 桶的名稱
* @return 桶對象信息
*/
@ObsClientAnnotation
public ObsBucket createBucket(String bucketName) {
ObsBucket obsBucket = new ObsBucket(bucketName, bucketLoc);
obsBucket.setBucketName(bucketName);
return obsClient.createBucket(obsBucket);
}
/**
* 桶的刪除
*
* @param bucketName 桶的名稱
* @return 響應對象
*/
@ObsClientAnnotation
public HeaderResponse deleteBucket(String bucketName) {
return obsClient.deleteBucket(bucketName);
}
/**
* 設置桶內指定前綴的文件對象 過期時間
*
* @param prefix 什麼前綴的文件過期(比如/tmp)
* @param expirationDays 幾天後過期
*/
@ObsClientAnnotation
public HeaderResponse setLiftConfig(String prefix, Integer expirationDays) {
LifecycleConfiguration config = new LifecycleConfiguration();
LifecycleConfiguration.Rule rule = config.new Rule();
rule.setEnabled(true);
//過期規則名稱
rule.setId(String.valueOf(UUID.randomUUID()));
rule.setPrefix(prefix);
LifecycleConfiguration.Expiration expiration = config.new Expiration();
// 指定滿足前綴的對象創建x天后過期
expiration.setDays(expirationDays);
LifecycleConfiguration.NoncurrentVersionExpiration noncurrentVersionExpiration = config.new NoncurrentVersionExpiration();
// 指定滿足前綴的對象成爲歷史版本x天后過期
noncurrentVersionExpiration.setDays(expirationDays);
rule.setNoncurrentVersionExpiration(noncurrentVersionExpiration);
config.addRule(rule);
return obsClient.setBucketLifecycle(bucketName, config);
}
/**
* 查詢桶的所有對象
*
* @return 桶內對象集合(關鍵屬性getObjectKey)
*/
@ObsClientAnnotation
public ObjectListing listObjects() {
ObjectListing listing = obsClient.listObjects(bucketName);
return listing;
}
/**
* 上傳對象時指定預定義訪問策略爲公共讀(很重要)
*
* @param objectKey 對象的key
* @param inputStream 要上傳的文件流
* @return 響應對象
*/
@ObsClientAnnotation
public PutObjectResult putObjectAndSetPreAccessStrategy(String objectKey, InputStream inputStream) {
PutObjectRequest request = new PutObjectRequest();
request.setBucketName(bucketName);
//對象的key 如: objectname1/text
request.setObjectKey(objectKey);
request.setInput(inputStream);
//設置對象訪問權限爲公共讀
request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
return obsClient.putObject(request);
}
/**
* 上傳對象時指定預定義訪問策略爲公共讀(很重要)
*
* @param objectKey 對象的key
* @param file 要上傳的文件
* @return 響應對象
*/
@ObsClientAnnotation
public PutObjectResult putObjectAndSetPreAccessStrategy(String objectKey, File file) {
PutObjectRequest request = new PutObjectRequest();
request.setBucketName(bucketName);
//對象的key 如: objectname1/text
request.setObjectKey(objectKey);
request.setFile(file);
//設置對象訪問權限爲公共讀
request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
return obsClient.putObject(request);
}
/**
* 上傳某個對象並設置對象自定義元數據
*
* @param objectKey 要上傳的key
* @param metadata 元數據對象
* @param inputStream 要上傳的文件流
* @return 上傳結果
* // ObjectMetadata metadata = new ObjectMetadata();
* // metadata.addUserMetadata("property1", "property-value1");
* // metadata.getMetadata().put("property2", "property-value2");
* // C:\\Users\\hufanglei\\Pictures\\timg.jpg"
*/
@ObsClientAnnotation
public PutObjectResult putObjectAndSetMeta(String objectKey, ObjectMetadata metadata, InputStream inputStream) {
return obsClient.putObject(bucketName, objectKey, inputStream, metadata);
}
/**
* 獲取某個對象
*
* @param objectKey 對象的key
* @return 對象的信息
*/
@ObsClientAnnotation
public ObsObject getObject(String objectKey) {
return obsClient.getObject(bucketName, objectKey, null);
}
/**
* 獲取某個對象的流
*
* @param objectKey 對象的key
* @return 對象的流
*/
@ObsClientAnnotation
public InputStream getObjectInpuStream(String objectKey) {
ObsObject obsObject = obsClient.getObject(bucketName, objectKey, null);
return obsObject.getObjectContent();
}
/**
* 查詢對象元數據(查詢某個對象的具體信息)
*
* @param objectKey 要查詢的key
* @return 對象元數據
*/
@ObsClientAnnotation
public ObjectMetadata getObjectMetadata(String objectKey) {
//獲取對象元數據
return obsClient.getObjectMetadata(bucketName, objectKey, null);
}
/**
* 拷貝對象(也可以從一個桶拷貝到另一個桶,這裏目前桶和原始文件桶都設置成了配置文件中的桶)
*
* @param sourceObjectKey 原始key
* @param destObjectKey 目標key
* @return 響應結果
*/
@ObsClientAnnotation
public CopyObjectResult copyObject(String sourceObjectKey, String destObjectKey) {
String sourceBucketName = bucketName;
String destBucketName = bucketName;
return obsClient.copyObject(sourceBucketName, sourceObjectKey, destBucketName, destObjectKey);
}
/**
* 刪除單個對象
*
* @param objectKey 要刪除的key
* @return 響應結果
*/
@ObsClientAnnotation
public DeleteObjectResult deletObj(String objectKey) {
return obsClient.deleteObject(bucketName, objectKey);
}
/**
* 下載某個對象到本地
*
* @param objectKey 對象的key
* @param localFilePath 本地文件路徑
* @throws ObsException
* @throws IOException
*/
@ObsClientAnnotation
public void downloadToLocalFile(String objectKey, String localFilePath) throws ObsException, IOException {
File localFile = new File(localFilePath);
if (!localFile.getParentFile().exists()) {
localFile.getParentFile().mkdirs();
}
ObsObject obsObject = obsClient.getObject(bucketName, objectKey, null);
ReadableByteChannel rchannel = Channels.newChannel(obsObject.getObjectContent());
ByteBuffer buffer = ByteBuffer.allocate(4096);
WritableByteChannel wchannel = Channels.newChannel(new FileOutputStream(new File(localFilePath)));
while (rchannel.read(buffer) != -1) {
buffer.flip();
wchannel.write(buffer);
buffer.clear();
}
rchannel.close();
wchannel.close();
}
/**
* 創建一個文件夾,必須帶有/後綴
*
* @param keySuffixWithSlash1 文件夾名稱(必須帶有/後綴)
* @return 響應對象
*/
@ObsClientAnnotation
public PutObjectResult createEmptyFolder(String keySuffixWithSlash1) {
return obsClient.putObject(bucketName, keySuffixWithSlash1, new ByteArrayInputStream(new byte[0]));
}
/**
* 判斷對象是否是文件夾
* @param keySuffixWithSlash1 文件夾名: 如: "MyObjectKey1/"
* @return 布爾值
*/
@ObsClientAnnotation
public boolean isEmptyFolder(String keySuffixWithSlash1) {
ObsObject object = obsClient.getObject(bucketName, keySuffixWithSlash1, null);
if (object != null) {
return object.getMetadata().getContentLength() == 0L;
}
return false;
}
/**
* 列舉某個文件夾下的所有對象
*
* @param folderPrefix 件夾名(必須/結尾)
* @return 對象集合
*/
@ObsClientAnnotation
public ObjectListing listObjectsByFolder(String folderPrefix) {
ListObjectsRequest request = new ListObjectsRequest(bucketName);
// 設置文件夾對象名"dir/"爲前綴
// request.setPrefix("dir/");
request.setPrefix(folderPrefix);
//列舉文件個數
request.setMaxKeys(1000);
ObjectListing result;
do {
result = obsClient.listObjects(request);
for (ObsObject obsObject : result.getObjects()) {
logger.info("\t" + obsObject.getObjectKey());
logger.info("\t" + obsObject.getOwner());
}
request.setMarker(result.getNextMarker());
} while (result.isTruncated());
return result;
}
/**
* 刪除某個文件夾下的所有對象
*
* @param folderPrefix 文件夾名(必須/結尾)
* @return 是否刪除成功
*/
@ObsClientAnnotation
public boolean deleteListObjectsByFolder(String folderPrefix) {
ListObjectsRequest request = new ListObjectsRequest(bucketName);
// 設置文件夾對象名"/xx/xxx/"爲前綴
request.setPrefix(folderPrefix);
//列舉文件個數
request.setMaxKeys(1000);
ObjectListing result;
do {
result = obsClient.listObjects(request);
for (ObsObject obsObject : result.getObjects()) {
logger.info("\t" + obsObject.getObjectKey());
logger.info("\t" + obsObject.getOwner());
//執行刪除
obsClient.deleteObject(bucketName, obsObject.getObjectKey());
}
request.setMarker(result.getNextMarker());
} while (result.isTruncated());
return true;
}
}
三、如何使用starter
0.前提 請注意
- obs的jar包在maven倉庫的版本很老了,所以去官網下載比較新的jar包。
- 需要將esdk-obs-java-3.19.11.1.jar加載進依賴或者上傳到私服,我已經上傳到自己的私服了,直接引pom即可,直接使用會報錯
- 如果報錯,請手動添加放在/obs-upload-spring-boot-starter/doc/lib下esdk-obs-java-3.19.11.1.jar
使用步驟1.引入自定義obs的starter
<dependency>
<groupId>com.wuzheng</groupId>
<artifactId>obs-upload-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
使用步驟2.配置文件設置參數
obs:
#端點(xx和地區對應)
endPoint: http://obs.xxx.myhuaweicloud.com
ak: yourself ak
sk: yourslef sk
bucketName: yourself 桶的名字
#地區
bucketLoc: xxx
使用步驟3.在springboot的啓動類上加上啓動註解
@EnableObsAutoConfiguration
項目中調用示例
@Service
public class UserService {
@Autowired
private ObsService obsService;
//以上傳爲例:其他方法看上面的接口列表
public static void obsUp() {
String objectKey = "XX";
File file = new File("XXXX");
obsService.putObjectAndSetPreAccessStrategy(objectKey, file);
}
四、springboot(華爲雲的obs)starter開源項目地址
https://gitee.com/hufanglei/obs-upload-spring-boot-starter
個人微信公衆號:
搜索: 怒放de每一天
不定時推送相關文章,期待和大家一起成長!!
完