欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java结合百度云存储BCS代码分享

程序员文章站 2024-02-29 16:01:22
一、简介   云也不是一个新概念了,云到底是什么东西,你叫我说个明明白白的我也说不出来,姑且算作联网的就叫做云。国内的云服务商还是有很多了,主要有两大类,一类是类似于...

一、简介

  云也不是一个新概念了,云到底是什么东西,你叫我说个明明白白的我也说不出来,姑且算作联网的就叫做云。国内的云服务商还是有很多了,主要有两大类,一类是类似于阿里云的类主机型的云提供商,比如万网等传统空间商转过来的;还有一类是应用应用托管平台,比如bae,sae。相对于阿里云等空间商之类的来说,应用托管平台的入门更低,为广大的苦逼程序猿提供了一个好的测试平台。

         我最近负责的软件升级程序,多平台多文件多版本,如果是自己架构文件服务器带宽肯定不能满足业务需求,于是上手百度云存储bcs服务,现在使用正常,但是偶尔的间歇性抽风让我不得不转向阿里云存储,毕竟商业的东西还是要商业化的专业,至少出问题了,不像百度云存储一样,客服都没有找到。但是作为技术使用,还是讲一讲云存储的使用。

二、使用步骤
 
  1、  注册百度帐号
 
    这个就不用我说了。
 
  2、  称为开发者
 
    进入“百度开放云平台”(不知道自己百度),登录后如果不是开发者,会提示让你注册称为开发者,填完资料就ok。
 
  3、  创建应用
 
    进入百度开放云首页,创建一个bae应用引擎,创建的时候解决方案不要选择:使用bae,除非你还有网站要挂上去。没事可以试一试。然后进入之后选择云存储,创建一个bucket(后面会说明)。

Java结合百度云存储BCS代码分享

Java结合百度云存储BCS代码分享

Java结合百度云存储BCS代码分享

  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
 
    通过这个访问该应用。

Java结合百度云存储BCS代码分享

四、详细实现
 
1、  导包

Java结合百度云存储BCS代码分享

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;
     }

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