最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java結(jié)合百度云存儲(chǔ)BCS代碼分享

 更新時(shí)間:2014年10月28日 11:23:00   投稿:hebedich  
最近云是一個(gè)很熱門的新概念,仿佛任何東西只要跟云相關(guān)聯(lián),就立馬高大上起來(lái),額,我們也追隨潮流吧,項(xiàng)目中也結(jié)合一下云??!

一、簡(jiǎn)介

  云也不是一個(gè)新概念了,云到底是什么東西,你叫我說(shuō)個(gè)明明白白的我也說(shuō)不出來(lái),姑且算作聯(lián)網(wǎng)的就叫做云。國(guó)內(nèi)的云服務(wù)商還是有很多了,主要有兩大類,一類是類似于阿里云的類主機(jī)型的云提供商,比如萬(wàn)網(wǎng)等傳統(tǒng)空間商轉(zhuǎn)過(guò)來(lái)的;還有一類是應(yīng)用應(yīng)用托管平臺(tái),比如BAE,SAE。相對(duì)于阿里云等空間商之類的來(lái)說(shuō),應(yīng)用托管平臺(tái)的入門更低,為廣大的苦逼程序猿提供了一個(gè)好的測(cè)試平臺(tái)。

         我最近負(fù)責(zé)的軟件升級(jí)程序,多平臺(tái)多文件多版本,如果是自己架構(gòu)文件服務(wù)器帶寬肯定不能滿足業(yè)務(wù)需求,于是上手百度云存儲(chǔ)BCS服務(wù),現(xiàn)在使用正常,但是偶爾的間歇性抽風(fēng)讓我不得不轉(zhuǎn)向阿里云存儲(chǔ),畢竟商業(yè)的東西還是要商業(yè)化的專業(yè),至少出問(wèn)題了,不像百度云存儲(chǔ)一樣,客服都沒(méi)有找到。但是作為技術(shù)使用,還是講一講云存儲(chǔ)的使用。

二、使用步驟
 
  1、  注冊(cè)百度帳號(hào)
 
    這個(gè)就不用我說(shuō)了。
 
  2、  稱為開(kāi)發(fā)者
 
    進(jìn)入“百度開(kāi)放云平臺(tái)”(不知道自己百度),登錄后如果不是開(kāi)發(fā)者,會(huì)提示讓你注冊(cè)稱為開(kāi)發(fā)者,填完資料就ok。
 
  3、  創(chuàng)建應(yīng)用
 
    進(jìn)入百度開(kāi)放云首頁(yè),創(chuàng)建一個(gè)BAE應(yīng)用引擎,創(chuàng)建的時(shí)候解決方案不要選擇:使用BAE,除非你還有網(wǎng)站要掛上去。沒(méi)事可以試一試。然后進(jìn)入之后選擇云存儲(chǔ),創(chuàng)建一個(gè)Bucket(后面會(huì)說(shuō)明)。

  4、  下載SDK
 
  5、  測(cè)試代碼
 

三、難點(diǎn)與注意
 
  1、沒(méi)有API或者API不詳細(xì)的SDK需要花費(fèi)你大量的精力去閱讀,甚至不如看別人的博客來(lái)的方便。
 
  2、概念的理解
 
    Bucket:創(chuàng)建應(yīng)用的之后,會(huì)創(chuàng)建一個(gè)Bucket,什么是Bucket,你把它想成是Windows下的一個(gè)盤符,就像是你創(chuàng)建了一個(gè)D盤,可以放文件,可以放文件夾,你還可以創(chuàng)建其他的Bucket。前面說(shuō)Bucket是一個(gè)盤符其實(shí)是不準(zhǔn)確的,因?yàn)樗袷荓inux下的根目錄,在讀取你的文件的時(shí)候,你不能說(shuō)我的文件是:1.txt。而是:/1.txt。代碼中已申明。
 
    Object:一個(gè)Object代表一個(gè)文件,他有很多元信息和文件塊組成(參考文件系統(tǒng)),元信息包括文件名,文件大小,時(shí)間等等。使用Object前,一定要記得"/";
 
  3、下載鑒權(quán)
 
    使用http請(qǐng)求下載私有文件需要帶上鑒權(quán)參數(shù),如果你閱讀官方的API,他只說(shuō)明了授權(quán)的加密過(guò)程,但是沒(méi)有Java版本,授權(quán)的步驟我不特別說(shuō)明,我也給出了Java的實(shí)現(xiàn),因?yàn)樵赟DK中已經(jīng)實(shí)現(xiàn)了,只是有一個(gè)小問(wèn)題。SDK生成的下載地址在Bucket與文件名之間的“/”被編碼,會(huì)導(dǎo)致部分下載器下載失敗,比如手機(jī)qq里面不能下載。需要再處理一下?! ?br />  
  4、API key與Secret Key
 
    通過(guò)這個(gè)訪問(wèn)該應(yīng)用。

四、詳細(xì)實(shí)現(xiàn)
 
1、  導(dǎo)包

2、  部分代碼
 
授權(quán):
 

復(fù)制代碼 代碼如下:

 public class BCSHelper {
     private String host = "";//主機(jī)名字: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
     }

上傳與刪除文件:
 

復(fù)制代碼 代碼如下:

 /**
      * 上傳文件到BCS
      *
      * @return boolean true表示上傳成功
      * @param file
      *            需要上傳的文件
      *
      * ******/
     public boolean putObject(File file) {
         boolean result = true;
         try {
             // 必須有“/”開(kāi)頭
             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;
     }
 
     /**
      * 通過(guò)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:
 

復(fù)制代碼 代碼如下:

 /**
      * 判斷該文件是否存在于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;
     }

 
自己寫的生成下載地址:
 
復(fù)制代碼 代碼如下:

 /**
      * 獲取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;
     }

修改過(guò)的SDK生成地址:

復(fù)制代碼 代碼如下:

      * 獲取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;
     }

  還有很多測(cè)試代碼官方已經(jīng)提供了,我也給出來(lái)的,需要的下載自己研究,再封裝一下就可以用在實(shí)際項(xiàng)目中了,我沒(méi)有發(fā)現(xiàn)上傳文件的進(jìn)度,希望看到的給我說(shuō)說(shuō),畢竟也是菜鳥(niǎo)一個(gè)。

相關(guān)文章

  • java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)詳解及實(shí)例代碼

    java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)詳解及實(shí)例代碼

    這篇文章主要介紹了java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Maven項(xiàng)目配置Tomcat的兩種方式

    Maven項(xiàng)目配置Tomcat的兩種方式

    本文主要介紹了Maven項(xiàng)目配置Tomcat的兩種方式,一種是用idea開(kāi)發(fā),另一種是eclipse開(kāi)發(fā),具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-05-05
  • Java使用poi將word轉(zhuǎn)換為html

    Java使用poi將word轉(zhuǎn)換為html

    這篇文章主要為大家詳細(xì)介紹了Java使用poi將word轉(zhuǎn)換為html的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解

    最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解

    這篇文章主要為大家介紹了最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Java序列化常見(jiàn)實(shí)現(xiàn)方法代碼實(shí)例

    Java序列化常見(jiàn)實(shí)現(xiàn)方法代碼實(shí)例

    這篇文章主要介紹了Java序列化常見(jiàn)實(shí)現(xiàn)方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 利用Java實(shí)現(xiàn)解析網(wǎng)頁(yè)中的內(nèi)容

    利用Java實(shí)現(xiàn)解析網(wǎng)頁(yè)中的內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言做一個(gè)解析指定網(wǎng)址的網(wǎng)頁(yè)內(nèi)容小應(yīng)用,文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的可以嘗試下
    2022-10-10
  • Java文件讀寫詳解

    Java文件讀寫詳解

    在真實(shí)的應(yīng)用場(chǎng)景中,很多時(shí)候需要使用?Java?讀寫文件。比如說(shuō),讀取配置文件信息、讀取用戶輸入等。本篇文章將會(huì)詳細(xì)介紹?Java?文件讀寫的相關(guān)知識(shí),其中包括:讀取文件、寫入文件、復(fù)制文件和刪除文件等操作,需要的朋友可以參考下
    2023-05-05
  • SpringBoot整合Hbase的實(shí)現(xiàn)示例

    SpringBoot整合Hbase的實(shí)現(xiàn)示例

    這篇文章主要介紹了SpringBoot整合Hbase的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 詳解java中this.getClass()和super.getClass()的實(shí)例

    詳解java中this.getClass()和super.getClass()的實(shí)例

    這篇文章主要介紹了詳解java中this.getClass()和super.getClass()的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • 例題詳解Java?dfs與記憶化搜索和分治遞歸算法的使用

    例題詳解Java?dfs與記憶化搜索和分治遞歸算法的使用

    遞歸指函數(shù)調(diào)用自身。常用的遞歸算法有dfs(深度優(yōu)先搜索)、記憶化搜索和分治,接下來(lái)將用幾個(gè)算法題來(lái)帶你熟練掌握它
    2022-04-04

最新評(píng)論

二手房| 大化| 梁平县| 临沂市| 卢氏县| 新邵县| 边坝县| 永清县| 定远县| 中超| 新龙县| 德庆县| 康保县| 台南市| 嵩明县| 建瓯市| 台东县| 江安县| 海城市| 临夏县| 绥棱县| 通城县| 同心县| 延长县| 大石桥市| 河北区| 广安市| 宜春市| 新津县| 永福县| 会泽县| 宁化县| 罗山县| 康平县| 芜湖县| 乐业县| 巴林右旗| 兴宁市| 鞍山市| 错那县| 井冈山市|