華爲雲的obs若是本身調用api的話,接口太多,不少不須要,依賴也不少(須要調用好幾個jar包)。因而想着本身給封裝下,引一個jar就能用多好啊。因而本身利用業餘時間自定義了這個starer,能夠快速投入開發,省時省力,但願幫助到你們。
/** * 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; } }
<dependency> <groupId>com.wuzheng</groupId> <artifactId>obs-upload-spring-boot-starter</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency>
obs: #端點(xx和地區對應) endPoint: http://obs.xxx.myhuaweicloud.com ak: yourself ak sk: yourslef sk bucketName: yourself 桶的名字 #地區 bucketLoc: xxx
@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); }
https://gitee.com/hufanglei/obs-upload-spring-boot-starterjava
我的微信公衆號:
搜索: 盛開de每一天
不定時推送相關文章,期待和你們一塊兒成長!!git
完spring