作者:Vinkn 来自http://www.cnblogs.com/Vinkn/

一、简介

  云也不是一个新概念了,云到底是什么东西,你叫我说个明明白白的我也说不出来,姑且算作联网的就叫做云。国内的云服务商还是有很多了,主要有两大类,一类是类似于阿里云的类主机型的云提供商,比如万网等传统空间商转过来的;还有一类是应用应用托管平台,比如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;
     }

  还有很多测试代码官方已经提供了,我也给出来的,需要的下载自己研究,再封装一下就可以用在实际项目中了,我没有发现上传文件的进度,希望看到的给我说说,毕竟也是菜鸟一个。

五、源码下载

http://pan.baidu.com/s/1bn1Y6BX

选择bcs_demo

Java使用百度云存储BCS-让你的数据下载飞起来的更多相关文章

  1. C#调用百度云存储接口上传文件

    因前几日见园子里有人说可以把网站静态文件放在百度上,于是去百度开放平台看了看,发现之前那篇文章不是调的云存储接口啊... 于是自己写了个C#能调百度云存储的例子(百度云开放平台只提供php.java. ...

  2. uploadify控制 上传图片到百度云存储

    最近使用uploadify 控制图片上传到百度网盘....总的想法是 招待会uploadify获取文件传入后台,调用百度云存储api上传到百度网盘,返回url 联系.送存储在数据库中的链接.因此,我们 ...

  3. 使用百度云 BOS 和 C# SDK 开发数据存储

    Ø  简介 本文主要介绍如何使用百度云的 C# SDK 操作 BOS(Baidu Object Storage/百度对象存储),以及常见问题和解决办法.本文将以以下几点展开学习: 1.   基本介绍 ...

  4. Java端百度云推送消息Demo

    因为在做Java服务器有用到推送消息机制,于是到网上找了一下,就自己试着敲了一个demo.这个demo主要是简单的一个对app消息推送. jar:百度云消息推送Java端的jar. package x ...

  5. 百度云bae安装discuz论坛教程

    作者:孤风一剑   发布:2013-05-11 13:37   栏目:站长在线   点击:6,846次   41条评论 各位草根们有福啦,弄了几天,终于可以在bae上搭建discuz论坛了,下面我就简 ...

  6. 坚果云创业团队访谈:我们 DIY 云存储(不要过度关注竞争对手,尤其当我们还是小公司的时候)

    坚果云(http://jianguoyun.com/)是一款用于多平台文件同步.备份和交换的云存储工具,立志于提供“便捷,安全”的服务.坚果云自去年年初启动内测,至今年三月初刚刚正式发布.近日我们拜访 ...

  7. Tampermonkey-让百度云下载飞起来

    1. 简介Tampermonkey是一款免费的浏览器扩展程序. 我们这里用于谷歌浏览器,目的是为了让百度云里面的文件以满速下载,节约金钱. 2. 安装安装Lantern蓝灯或者其他的FQ工具. 打开F ...

  8. [转]油猴Tampermonkey-让百度云下载飞起来

    1. 简介 Tampermonkey,油猴脚本是一款免费的浏览器扩展程序. 我们这里用于Chrome浏览器,目的是为了让百度云里面的文件以满速下载,VIP还得出钱呢. 2. 安装 安装Lantern蓝 ...

  9. 混合云存储组合拳:基于云存储网关与混合云备份的OSS数据备份方案

    前言 阿里云对象存储(OSS)用户众多.很多用户因为业务或者合规性需求,需要对OSS内的数据做备份,无论是线上备份,还是线下备份.用户可以选择使用OSS的开放API,按照业务需求,做数据的备份,也可以 ...

随机推荐

  1. cmd命令行设置环境变量

    http://blog.sciencenet.cn/blog-51026-566742.html 1.查看当前所有可用的环境变量:输入 set 即可查看. 2.查看某个环境变量:输入 “set 变量名 ...

  2. [转载]jQuery UI 使用

    最近项目中使用了一些插件来做页面,这里把jQuery UI的使用分享出来,希望 对新手有帮助.文章结尾附源码下载. 1     jQuery UI 2     为我所用 2.1     Tabs 2. ...

  3. Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 5763  Solved: 2660[Subm ...

  4. Linux process state codes

    Here are the different values that the s, stat and state output specifiers (header "STAT" ...

  5. SRM 441(1-250pt, 1-500pt)

    DIV1 250pt 题意:用数组A表示置换,由该置换得到数组B(B[0] = 0, B[i] = A[B[i-1]]).给定A,求一个A',使得由A'得到的B为单循环置换且A'与A的差距最小.定义A ...

  6. JavaScript之闭包与高阶函数(一)

    JavaScript虽是一门面向对象的编程语言,但同时也有许多函数式编程的特性,如Lambda表达式,闭包,高阶函数等. 函数式编程是种编程范式,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 ...

  7. sonarQube本机扫描C#项目

    因项目需要,需要使用sonarQube对代码进行扫描并查看,因对sonarQube不熟悉,所以先在本机进行查看. 参考了张老师的博客:http://www.cnblogs.com/danzhang/p ...

  8. UVa1606 UVaLive3259 FZU1309 HDU1661 POJ2280 ZOJ2390 Amphiphilic Carbon Molecules

    填坑系列 考虑所有经过两个点的直线,一定有最优解. 再考虑确定一个点,按极角顺序枚举所有直线,从而O(1)转移信息. 还有代码实现技巧 #include<cstdio> #include& ...

  9. docker镜像与仓库

    1.docker image 镜像 容器的基石 层叠的只读文件系统 联合加载(union mount)   2.镜像存储地址 /var/lib/docker 3.镜像操作 列出镜像 镜像标签和仓库 查 ...

  10. ServerVersion 引发了“System.InvalidOperationException”类型的异常

    遇到这样一个问题:添加互评信息,断点调试,跳转到BLL层后就直接跳到SqlHelper中弹出错误,说:未将对象设置引用到实例等.还请人帮忙调试代码,调试半天发现抽象工厂并没成功完成反射,奇怪的是:将出 ...