Java使用百度云存储BCS-让你的数据下载飞起来
作者: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-让你的数据下载飞起来的更多相关文章
- C#调用百度云存储接口上传文件
因前几日见园子里有人说可以把网站静态文件放在百度上,于是去百度开放平台看了看,发现之前那篇文章不是调的云存储接口啊... 于是自己写了个C#能调百度云存储的例子(百度云开放平台只提供php.java. ...
- uploadify控制 上传图片到百度云存储
最近使用uploadify 控制图片上传到百度网盘....总的想法是 招待会uploadify获取文件传入后台,调用百度云存储api上传到百度网盘,返回url 联系.送存储在数据库中的链接.因此,我们 ...
- 使用百度云 BOS 和 C# SDK 开发数据存储
Ø 简介 本文主要介绍如何使用百度云的 C# SDK 操作 BOS(Baidu Object Storage/百度对象存储),以及常见问题和解决办法.本文将以以下几点展开学习: 1. 基本介绍 ...
- Java端百度云推送消息Demo
因为在做Java服务器有用到推送消息机制,于是到网上找了一下,就自己试着敲了一个demo.这个demo主要是简单的一个对app消息推送. jar:百度云消息推送Java端的jar. package x ...
- 百度云bae安装discuz论坛教程
作者:孤风一剑 发布:2013-05-11 13:37 栏目:站长在线 点击:6,846次 41条评论 各位草根们有福啦,弄了几天,终于可以在bae上搭建discuz论坛了,下面我就简 ...
- 坚果云创业团队访谈:我们 DIY 云存储(不要过度关注竞争对手,尤其当我们还是小公司的时候)
坚果云(http://jianguoyun.com/)是一款用于多平台文件同步.备份和交换的云存储工具,立志于提供“便捷,安全”的服务.坚果云自去年年初启动内测,至今年三月初刚刚正式发布.近日我们拜访 ...
- Tampermonkey-让百度云下载飞起来
1. 简介Tampermonkey是一款免费的浏览器扩展程序. 我们这里用于谷歌浏览器,目的是为了让百度云里面的文件以满速下载,节约金钱. 2. 安装安装Lantern蓝灯或者其他的FQ工具. 打开F ...
- [转]油猴Tampermonkey-让百度云下载飞起来
1. 简介 Tampermonkey,油猴脚本是一款免费的浏览器扩展程序. 我们这里用于Chrome浏览器,目的是为了让百度云里面的文件以满速下载,VIP还得出钱呢. 2. 安装 安装Lantern蓝 ...
- 混合云存储组合拳:基于云存储网关与混合云备份的OSS数据备份方案
前言 阿里云对象存储(OSS)用户众多.很多用户因为业务或者合规性需求,需要对OSS内的数据做备份,无论是线上备份,还是线下备份.用户可以选择使用OSS的开放API,按照业务需求,做数据的备份,也可以 ...
随机推荐
- [Citrix NetScaler] 简述
额 就这个题目 Citrix NetScaler 是一个VPN,一个代理,一个Gateway的存在,一个Citrix的产品 首先是我们利用Citrix NetScaler的测试环境: 架构上分2种: ...
- unity3d AI's sight
just finished -----by wolf96
- xrdp远程 & watchdog 启用与测试 & WebRTC
sudo apt-get install xrdp sudo apt-get install vnc4server tightvncserver echo "xfce4-session&qu ...
- hdu 4738 Caocao's Bridges (tarjan求桥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值.现在要你破坏任意一个边(要付出相 ...
- c\c++复习基础要点16----枚举类型
枚举类型: 语法格式: enum 枚举类型名 {变量值列表}; 例如: enum Weekday{sun, mon, tue, wed, thu, fri, set}; 声明了枚举类型后,就可以定义 ...
- IE的Cookie目录和临时缓存目录的关系
1.IE的Cookie位置注册表设置: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folde ...
- SQL server 创建表,索引,主键,外键
if object_id('student', 'U') is not null drop table student go create table student( sno varchar(20) ...
- TortoiseSVN搭建本地版本库及简单操作使用
TortoiseSVN是windows上一款著名的版本控制软件,对于我们管理自己的代码,特别是对一个团队来说,非常重要. 本文探讨的是如何搭建本地的版本库. (1)安装TortoiseSVN之后需要创 ...
- [JS][jQuery]remove()与 empty()的差别
要用到移除指定元素的时候,发现empty()与remove([expr])都能够用来实现.可细致观察效果的话就能够发现. empty()是仅仅移除了 指定元素中的全部子节点.拿$("p&qu ...
- wdlinux 编译pdo_mysql
由于项目需要用到pdo 链接数据库 wdlinux在centos6.4下 没有pdomysql模块 ,所以重新编译 有的系统无法使用pdo_mysql 1 重新编译mysql http://www.w ...