当前位置: 首页 > 编程笔记 >

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

路奇
2023-03-14
本文向大家介绍Java结合百度云存储BCS代码分享,包括了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;

     } 

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

 类似资料:
  • 本文向大家介绍Python Web框架Flask中使用百度云存储BCS实例,包括了Python Web框架Flask中使用百度云存储BCS实例的使用技巧和注意事项,需要的朋友参考一下 对于部署在百度应用引擎BAE上的项目,使用百度云存储BCS(Baidu Cloud Storage)是不错的存储方案。 百度云存储已有Python SDK,对它进行简单封装后,就可以直接在Flask中使用了,项目代码

  • 百度云分享爬虫项目 github上有好几个这样的开源项目,但是都只提供了爬虫部分,这个项目在爬虫的基础上还增加了保存数据,建立elasticsearch索引的模块,可以用在实际生产环境中,不过web模块还是需要自己开发 安装 安装node.js和pm2,node用来运行爬虫程序和索引程序,pm2用来管理node任务 安装mysql和mongodb,mysql用来保存爬虫数据,mongodb用来保存

  • 全程一小时 1.关于项目询问…… 2.C++: 忘了有啥了,应该都是常见的 4.分布式: ACID是什么 CAP是什么 RAFT如是实现投票? 经典的超过半数投票…… Zookeeper如何避免脑裂? 答:采用2N+1个 replica。 反问:如果有一个宕机了就不能了吗? 答:不能,要么手动再宕机一个节点,要么加上一个replica。不然容易出问题 好像认可了我的答案…… 分布式系统中如果我向r

  • 本文向大家介绍Python使用百度API上传文件到百度网盘代码分享,包括了Python使用百度API上传文件到百度网盘代码分享的使用技巧和注意事项,需要的朋友参考一下 关于如何获取 access_token 这个可以自己查百度开放的OAuth 2.0 的 API。这里不做介绍。 第三方 Python 库 poster

  • 百度做TafDB的,支持百度云对象存储和文件系统存储的bu 1. 前面简单介绍了一些实习做的事儿 2. 分布式场景怎么保证消息一致性并且不重不漏 3. 假设有10台服务器同时在服务,用户只给其中一台发消息,其他几台服务器怎么同步的?集群管理是怎么做的 1. 比如说用户a连到 SERVER 1,用户 b 连到 SERVER 2。他俩之间,用户 b 是怎么看到用户 a 的消息的? 4. 实现二叉搜索树

  • 一面(45min) 1.自我介绍 2.实习经历深挖;介绍一下实习做的最好的项目 3.介绍工作职责和负责的项目;公共资源布局评价方案的设计,如何从时间、服务两个维度对资源布局完成量化评价 4.数据科学专业都学什么课程 5.对深度学习有什么了解 6.case题:一个图片审核的商业化产品,如何给企业定价 7.对云计算有什么了解,IAAS,PAAS,SAAS有什么异同? 8.C端和B端的差别,未来倾向于做