Java結(jié)合百度云存儲BCS代碼分享
一、簡介
云也不是一個新概念了,云到底是什么東西,你叫我說個明明白白的我也說不出來,姑且算作聯(lián)網(wǎng)的就叫做云。國內(nèi)的云服務(wù)商還是有很多了,主要有兩大類,一類是類似于阿里云的類主機型的云提供商,比如萬網(wǎng)等傳統(tǒng)空間商轉(zhuǎn)過來的;還有一類是應(yīng)用應(yīng)用托管平臺,比如BAE,SAE。相對于阿里云等空間商之類的來說,應(yīng)用托管平臺的入門更低,為廣大的苦逼程序猿提供了一個好的測試平臺。
我最近負(fù)責(zé)的軟件升級程序,多平臺多文件多版本,如果是自己架構(gòu)文件服務(wù)器帶寬肯定不能滿足業(yè)務(wù)需求,于是上手百度云存儲BCS服務(wù),現(xiàn)在使用正常,但是偶爾的間歇性抽風(fēng)讓我不得不轉(zhuǎn)向阿里云存儲,畢竟商業(yè)的東西還是要商業(yè)化的專業(yè),至少出問題了,不像百度云存儲一樣,客服都沒有找到。但是作為技術(shù)使用,還是講一講云存儲的使用。
二、使用步驟
1、 注冊百度帳號
這個就不用我說了。
2、 稱為開發(fā)者
進(jìn)入“百度開放云平臺”(不知道自己百度),登錄后如果不是開發(fā)者,會提示讓你注冊稱為開發(fā)者,填完資料就ok。
3、 創(chuàng)建應(yīng)用
進(jìn)入百度開放云首頁,創(chuàng)建一個BAE應(yīng)用引擎,創(chuàng)建的時候解決方案不要選擇:使用BAE,除非你還有網(wǎng)站要掛上去。沒事可以試一試。然后進(jìn)入之后選擇云存儲,創(chuàng)建一個Bucket(后面會說明)。
4、 下載SDK
5、 測試代碼
三、難點與注意
1、沒有API或者API不詳細(xì)的SDK需要花費你大量的精力去閱讀,甚至不如看別人的博客來的方便。
2、概念的理解
Bucket:創(chuàng)建應(yīng)用的之后,會創(chuàng)建一個Bucket,什么是Bucket,你把它想成是Windows下的一個盤符,就像是你創(chuàng)建了一個D盤,可以放文件,可以放文件夾,你還可以創(chuàng)建其他的Bucket。前面說Bucket是一個盤符其實是不準(zhǔn)確的,因為它更像是Linux下的根目錄,在讀取你的文件的時候,你不能說我的文件是:1.txt。而是:/1.txt。代碼中已申明。
Object:一個Object代表一個文件,他有很多元信息和文件塊組成(參考文件系統(tǒng)),元信息包括文件名,文件大小,時間等等。使用Object前,一定要記得"/";
3、下載鑒權(quán)
使用http請求下載私有文件需要帶上鑒權(quán)參數(shù),如果你閱讀官方的API,他只說明了授權(quán)的加密過程,但是沒有Java版本,授權(quán)的步驟我不特別說明,我也給出了Java的實現(xiàn),因為在SDK中已經(jīng)實現(xiàn)了,只是有一個小問題。SDK生成的下載地址在Bucket與文件名之間的“/”被編碼,會導(dǎo)致部分下載器下載失敗,比如手機qq里面不能下載。需要再處理一下?! ?br />
4、API key與Secret Key
通過這個訪問該應(yīng)用。
四、詳細(xì)實現(xiàn)
1、 導(dǎo)包
2、 部分代碼
授權(quán):
public class BCSHelper {
private String host = "";//主機名字:bcs.duapp.com
private String accessKey = "";//在你創(chuàng)建的應(yīng)用中可以看到
private String secretKey = "";
private String bucket = "";//你創(chuàng)建的Bucket名字
private BaiduBCS baiduBCS = null;
public BCSHelper() {
this.host = Configuration.getHost();
this.accessKey = Configuration.getAccessKey();
this.secretKey = Configuration.getSecretKey();
this.bucket = Configuration.getBucket();
BCSCredentials credentials = new BCSCredentials(accessKey, secretKey);
baiduBCS = new BaiduBCS(credentials, host);
baiduBCS.setDefaultEncoding("UTF-8"); // Default UTF-8
}
上傳與刪除文件:
/**
* 上傳文件到BCS
*
* @return boolean true表示上傳成功
* @param file
* 需要上傳的文件
*
* ******/
public boolean putObject(File file) {
boolean result = true;
try {
// 必須有“/”開頭
PutObjectRequest request = new PutObjectRequest(bucket, "/" + file.getName(), file);
// 設(shè)置Object的元信息
ObjectMetadata metadata = new ObjectMetadata();
request.setMetadata(metadata);
baiduBCS.putObject(request);
LoggerService.addLoggerByOperate("BCS:上傳文件到BCS:"+file.getName());
} catch (Exception e) {
result = false;
LoggerService.addLoggerByError(e.getMessage());
e.printStackTrace();
}
return result;
}
/**
* 通過Object名刪除BCS上面的文件
*
* @param object
* Object的名字
* @return boolean true刪除成功
* *****/
public boolean deleteObject(String object) {
boolean result = true;
try {
if (existObject(object)) {
baiduBCS.deleteObject(bucket, "/" + object);
LoggerService.addLoggerByOperate("BCS:刪除BCS上的文件:"+object);
}
} catch (Exception e) {
result = false;
e.printStackTrace();
LoggerService.addLoggerByError(e.getMessage());
}
return result;
}
判斷是否存在Object:
/**
* 判斷該文件是否存在于BCS
*
* @param object
* object名
* @return boolean true表示存在
* ***/
public boolean existObject(String object) {
boolean result = false;
try {
result = baiduBCS.doesObjectExist(bucket, "/" + object);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
自己寫的生成下載地址:
/**
* 獲取Object的下載地址
*
* @param object
* Object名字
* @return String 返回下載的url
*******/
public String getUrl(String object) {
// 需要加密的內(nèi)容
String data = "MBO" + "\n" + "Method=GET" + "\n" + "Bucket=" + bucket + "\n" + "Object=/" + object + "\n";
// 加密的結(jié)果
String hmacsha1 = getHmacSHA1(secretKey, data);
// 構(gòu)造sign參數(shù)
String sign = "MBO:" + accessKey + ":" + hmacsha1;
// url
StringBuilder builder = new StringBuilder();
builder.append("http://");
builder.append(host);
builder.append("/");
builder.append(bucket);
builder.append("/");
builder.append(object);
builder.append("?sign=");
builder.append(sign);
return builder.toString();
}
// 簽名加密
private String getHmacSHA1(String secretKey, String data) {
String result = "";
try {
SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(data.getBytes());
Base64 base64 = new Base64();
@SuppressWarnings("static-access")
byte[] enbytes = base64.encodeBase64Chunked(rawHmac);
result = new String(enbytes, "utf-8");
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
修改過的SDK生成地址:
* 獲取Object的下載地址
*
* @param object
* Object名字
* @return String 返回下載的url
*******/
public String getUrl(String object) {
String result = "";
GenerateUrlRequest generateUrlRequest = new GenerateUrlRequest(HttpMethodName.GET, bucket, "/" + object);
generateUrlRequest.setBcsSignCondition(new BCSSignCondition());
result = baiduBCS.generateUrl(generateUrlRequest);
result=result.replaceFirst("%2F", "/");
return result;
}
還有很多測試代碼官方已經(jīng)提供了,我也給出來的,需要的下載自己研究,再封裝一下就可以用在實際項目中了,我沒有發(fā)現(xiàn)上傳文件的進(jìn)度,希望看到的給我說說,畢竟也是菜鳥一個。
相關(guān)文章
Spring?Cloud?OAuth2實現(xiàn)自定義token返回格式
Spring?Security?OAuth的token返回格式都是默認(rèn)的,但是往往這個格式是不適配系統(tǒng)。本文將用一個接口優(yōu)雅的實現(xiàn)?Spring?Cloud?OAuth2?自定義token返回格式,需要的可以參考一下2022-06-06線程局部變量的實現(xiàn)?ThreadLocal使用及場景介紹
這篇文章主要為大家介紹了線程局部變量的實現(xiàn)?ThreadLocal使用及場景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01SpringBoot @PostConstruct和@PreDestroy的使用說明
這篇文章主要介紹了SpringBoot @PostConstruct和@PreDestroy的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09基于EasyExcel實現(xiàn)百萬級數(shù)據(jù)導(dǎo)入導(dǎo)出詳解
大數(shù)據(jù)的導(dǎo)入和導(dǎo)出,相信大家在日常的開發(fā)、面試中都會遇到。本文將為大家詳細(xì)介紹一下如何利用EasyExcel實現(xiàn)百萬級數(shù)據(jù)導(dǎo)入導(dǎo)出,需要的可以參考一下2023-01-01