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

一、简介

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

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

(0)

相关推荐

  • 访问百度和谷歌网速测试的javascript代码

    以下是访问百度和谷歌网速测试,请问怎么把得到的二个值保存到save变量里,并用document.write(save); 输出出来,谢谢! "); for(var i=1;i"); } document.write(""); } butt(); function auto(url,b){ document.forms[0]["txt"+b].value="响应时间:"+tim/100+"秒" } funct

  • javascript使用百度地图api和html5特性获取浏览器位置

    复制代码 代码如下: <!DOCTYPE html><html><body><p id="demo">点击这个按钮,获得您的位置:</p><button onclick="getLocation()">试一下</button><script src="http://api.map.baidu.com/api?v=1.4" type="text/ja

  • java实现百度坐标的摩卡托坐标与火星坐标转换的示例

    这是百度地图的摩卡托坐标与火星坐标的相互转换方法,大家参考使用吧 复制代码 代码如下: /** * 百度摩卡拖坐标与火星坐标的加密解密算法 * @author XFan * */public class Outer { private static double lat = 31.22997; private static double lon = 121.640756; public static double x_pi = lat * lon / 180.0; public static v

  • 百度手写板代码JavaScript远程调用的实现(鼠标输入法)

    百度在线手写板 #sx{color:#00C;text-decoration:underline;cursor:pointer;} 手写 var w = window,d = document,n = navigator,k = d.f.wd if (w.attachEvent) { w.attachEvent("onload", function() {k.focus();}) } else { w.addEventListener('load', function() {k.foc

  • java调用百度定位api服务获取地理位置示例

    复制代码 代码如下: package test; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Reader;import java.net.URL;import java.nio.charset.Charset; import org.json.JSONException;imp

  • [转]去百度面试的javascript 收获

    这是我记得的问题,基本都没答上来,大家知道的教教小弟,咱不能再不会了 1.在js里类的继承一般是类抄写和原型继承混合使用,在extjs的extend里就是这两种方式混合 但考官问我,这样不是也在子类里加入了对父类函数的引用吗,(会在子类里加上superClass属性)这不是也是污染吗,怎么做更好的,当时被问傻 2.p元素里可不可以加div,不可以为啥,平时从来没想过这个问题 这个我找到了答案 不可以,我试过了 New Document [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

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

    一.简介 云也不是一个新概念了,云到底是什么东西,你叫我说个明明白白的我也说不出来,姑且算作联网的就叫做云.国内的云服务商还是有很多了,主要有两大类,一类是类似于阿里云的类主机型的云提供商,比如万网等传统空间商转过来的:还有一类是应用应用托管平台,比如BAE,SAE.相对于阿里云等空间商之类的来说,应用托管平台的入门更低,为广大的苦逼程序猿提供了一个好的测试平台. 我最近负责的软件升级程序,多平台多文件多版本,如果是自己架构文件服务器带宽肯定不能满足业务需求,于是上手百度云存储BCS服务,现在使

  • Python Web框架Flask中使用百度云存储BCS实例

    对于部署在百度应用引擎BAE上的项目,使用百度云存储BCS(Baidu Cloud Storage)是不错的存储方案. 百度云存储已有Python SDK,对它进行简单封装后,就可以直接在Flask中使用了,项目代码见GitHub上Flask-BCS. 使用示例代码: 复制代码 代码如下: from flask import Flask from flask_bcs import BCS   BCS_HOST = 'BCS HOST' BCS_ACCESS_KEY = 'BCS Access K

  • java实现百度云文字识别接口代码

    本文实例为大家分享了java实现百度云文字识别的接口具体代码,供大家参考,具体内容如下 public class Images { public static String getResult() { String otherHost = "https://aip.baidubce.com/rest/2.0/ocr/v1/general"; // 本地图片路径 String str="你的本地图片路径" String filePath = "str&quo

  • java实现百度云OCR文字识别 高精度OCR识别身份证信息

    本文为大家分享了java实现百度云OCR识别的具体代码,高精度OCR识别身份证信息,供大家参考,具体内容如下 1.通用OCR文字识别 这种OCR只能按照识别图片中的文字,且是按照行识别返回结果,精度较低. 首先引入依赖包: <dependency> <groupId>com.baidu.aip</groupId> <artifactId>java-sdk</artifactId> <version>4.6.0</version&

  • Java编程几个循环实例代码分享

    有关Java循环的内容,编程中还是比较常用的,下面分享给大家几个循环的示例代码,练习一下. 1.循环输出1到100之间所有能被3或能被4整除的数. package com.hz.loop02; /** * 1.循环输出1到100之间所有能被3或能被4整除的数. * @author ztw * */ public class Practice01 { public static void main(String[] args) { for (int i=1;i<=100;i++){ //判断下是否

  • java编程实现求解八枚银币代码分享

    1.引言 笔者在大学的算法竞赛中,遇到过这样的一个题目,现在拿出来与大家分享一下:现在有现有八枚银币abcdefgh,已知其中一枚是假币,其重量不同于真币,但不知是较轻或较重,如何使用天平以最少的比较次数,决定出哪枚是假币,并得知假币比真币较轻或较重. 2.分析 如果本题目只是很单纯的求解假币是哪一个,问题倒并不是很复杂,只需要回溯递归便可求得结果.问题的难点在意,我们需要用最少的步骤!!! 比之以前的数据结构问题,有递归,回溯,我们今天可能要接触一个新的概念,叫做树.顾名思义,数结构就是说我们

  • Java语言实现Blowfish加密算法完整代码分享

    前几天网上突然出现流言:某东发生数据泄露12G,最终某东在一篇声明中没有否认,还算是勉强承认了吧,这件事对于一般人有什么影响.应该怎么做已经有一堆人说了,所以就不凑热闹了,咱来点对程序猿来说实际点的,说一个个人认为目前比较安全的加密算法:Blowfish. 上代码之前,先说几点Blowfish加密算法的特点: 1. 对称加密,即加密的密钥和解密的密钥是相同的: 2. 每次加密之后的结果是不同的(这也是老夫比较欣赏的一点): 3. 可逆的,和老夫之前的文章介绍的md5等摘要算法不一样,他是可逆的:

  • Java解压zip文件完整代码分享

    关于Java解压zip文件,我觉得也没啥好多说的,就是干呗..代码如下: package com.lanyuan.assembly.util; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; i

  • Java编程一个随机数产生模块代码分享

    java随机数的产生比较简单,可以通过 Random rand = new Random(47); System.out.println(rand.nextInt()); 产生,也可以通过以下产生: double d = Math.random(); 当然代码中前者由于使用了固定的种子47,所以每次的值都是一样的,也可以使用 Random rand = new Random(); System.out.println(rand.nextInt()); 而对于代码2则产生的是double的随机数.

  • Java实现读写文件功能的代码分享

    目录 读文件 写文件 主函数 实现效果 下面是利用Java实现读写文件功能的示例代码 读文件 TextRead.java import java.io.BufferedReader; import java.io.File; import java.io.FileReader; public class TextRead { /** * 读取txt文件的内容 * @param file 想要读取的文件对象 * @return 返回文件内容 */ public static String txt2

随机推荐