Java結合百度雲端儲存BCS代碼分享_java

來源:互聯網
上載者:User

一、簡介

  雲也不是一個新概念了,雲到底是什麼東西,你叫我說個明明白白的我也說不出來,姑且算作連網的就叫做雲。國內的雲端服務商還是有很多了,主要有兩大類,一類是類似於阿里雲的類主機型的雲供應商,比如萬網等傳統空間商轉過來的;還有一類是應用應用託管平台,比如BAE,SAE。相對於阿里雲等空間商之類的來說,應用託管平台的入門更低,為廣大的苦逼程式猿提供了一個好的測試平台。

         我最近負責的軟體升級程式,多平台多檔案多版本,如果是自己架構檔案伺服器頻寬肯定不能滿足業務需求,於是上手百度雲端儲存BCS服務,現在使用正常,但是偶爾的間歇性抽風讓我不得不轉向阿里雲儲存,畢竟商業的東西還是要商業化的專業,至少出問題了,不像百度雲端儲存一樣,客服都沒有找到。但是作為技術使用,還是講一講雲端儲存的使用。

二、使用步驟
 
  1、  註冊百度帳號
 
    這個就不用我說了。
 
  2、  稱為開發人員
 
    進入“百度開放雲平台”(不知道自己百度),登入後如果不是開發人員,會提示讓你註冊稱為開發人員,填完資料就ok。
 
  3、  建立應用
 
    進入百度開放雲首頁,建立一個BAE應用引擎,建立的時候解決方案不要選擇:使用BAE,除非你還有網站要掛上去。沒事可以試一試。然後進入之後選擇雲端儲存,建立一個Bucket(後面會說明)。

  4、  下載SDK
 
  5、  測試代碼
 

三、痛點與注意
 
  1、沒有API或者API不詳細的SDK需要花費你大量的精力去閱讀,甚至不如看別人的部落格來的方便。
 
  2、概念的理解
 
    Bucket:建立應用的之後,會建立一個Bucket,什麼是Bucket,你把它想成是Windows下的一個盤符,就像是你建立了一個D盤,可以放檔案,可以放檔案夾,你還可以建立其他的Bucket。前面說Bucket是一個盤符其實是不準確的,因為它更像是Linux下的根目錄,在讀取你的檔案的時候,你不能說我的檔案是:1.txt。而是:/1.txt。代碼中已申明。
 
    Object:一個Object代表一個檔案,他有很多元資訊和檔案塊組成(參考檔案系統),元資訊包括檔案名稱,檔案大小,時間等等。使用Object前,一定要記得"/";
 
  3、下載鑒權
 
    使用http請求下載私人檔案需要帶上鑒權參數,如果你閱讀官方的API,他只說明了授權的加密過程,但是沒有Java版本,授權的步驟我不特別說明,我也給出了Java的實現,因為在SDK中已經實現了,只是有一個小問題。SDK產生的下載地址在Bucket與檔案名稱之間的“/”被編碼,會導致部分下載器下載失敗,比如手機qq裡面不能下載。需要再處理一下。  
 
  4、API key與Secret Key
 
    通過這個訪問該應用。

四、詳細實現
 
1、  導包

2、  部分代碼
 
授權:
 

複製代碼 代碼如下:

 public class BCSHelper {
     private String host = "";//主機名稱字:bcs.duapp.com
     private String accessKey = "";//在你建立的應用中可以看到
     private String secretKey = "";
     private String bucket = "";//你建立的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);
             // 設定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) {
         // 需要加密的內容
         String data = "MBO" + "\n" + "Method=GET" + "\n" + "Bucket=" + bucket + "\n" + "Object=/" + object + "\n";
         // 加密的結果
         String hmacsha1 = getHmacSHA1(secretKey, data);
         // 構造sign參數
         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;
     }

  還有很多測試代碼官方已經提供了,我也給出來的,需要的下載自己研究,再封裝一下就可以用在實際項目中了,我沒有發現上傳檔案的進度,希望看到的給我說說,畢竟也是菜鳥一個。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.