参加 D2 2015 技术论坛感想

上周末去杭州阿里巴巴西溪园区参加了 2015 年的 D2 论坛,正好是第十届。

我听了一天的主会场,并在知乎上实时直播: 参加第十届D2前端技术论坛,你有什么收获? – yuanyuanVivian 的答案 。在这里谈谈自己的心得感想吧!

NodeJs 开始绽放

主会场的几场分享都还算挺不错。其中 NodeJS 相关的两场分享,一个是 Tmall 的线上经验,一个是 QZone 的线上经验,都是耳熟能详的大网站。我认为这代表 NodeJs 的线上能力已经得到了足够的验证,可以加快推广了继续阅读参加 D2 2015 技术论坛感想

NodeJs批量下载“百度云存储(BCS)”的所有文件

导语

NodeJs 是一个使用 V8 JS 引擎的服务器端编程语言。百度云存储的英文缩写是 BCS ,是百度开发者中心提供的云存储服务。

本文阐述利用官方提供的 RESTful API 将 BCS 上的文件批量按源路径下载并保存下来的一种方法。需要安装了 NodeJs

获取签名

首先通过官方的 URL 签名界面取得签名,在 BAE 3.0 的“管理开发者服务”界面中,点击左侧的“云存储”,再选择一个 Bucket ,再点击“URL签名”,如下图所示。

百度云存储(BCS)官方生成签名界面截图
百度云存储(BCS)官方生成签名界面截图

点击“签名”按钮,即可得到一个像 http://bcs.duapp.com/bucket?sign=xxx 的地址。其中 bucket 是你的 bucket 名, xxx 就是签名字符串。

依赖的 NodeJs 模块

本文使用到 NodeJs 内置的文件系统模块和 GitHub 上的 request 模块。request 是 NodeJs 实现的 curl ,先安装 request。
npm install request

NodeJs 代码

1.引入依赖的模块

var fs = require('fs');
request = require('request');

2.声明签名字符串,会多次用到

var sign = '你的签名字符串';

3.自动创建不存在的目录

由于 fs 创建文件时无法自动创建目录,需要手动检查目录是否存在,若不存在就创建,所以需要自己编写一个。

var MKDirIfNotExist = function(filePN){
var dirArr = filePN.split('/'), cPath = '';
for(var i = 0, len = dirArr.length; i < len; i ++){
if(dirArr[i]) {
cPath += dirArr[i];
var exists = fs.existsSync(cPath);
if(!exists){
fs.mkdirSync(cPath);
}
cPath += '/';
}
}
}

函数的作用是传入代表目录地址的字符串,若脚本运行目录下不存在该字符串表示的路径,则创建。

4.读取 RESTful API 的文件列表和内容并保存本地

这里终于切入了正题。生成签名那里生成的 RESTful API 地址直接可以列出最多 200 个 Bucket 上的文件及其路径,可以直接读取并下载它们。

request('http://bcs.duapp.com/你的bucket名?sign=你的签名字符串', function (error, response, body) {
if (!error && response.statusCode == 200) {
var bodyJSON = JSON.parse(body);
for(var i = 0, len = bodyJSON.object_total; i < len; i ++){
if(bodyJSON.object_list[i].is_dir == '0'){
MKDirIfNotExist(bodyJSON.object_list[i].parent_dir);
fs.openSync('./' + bodyJSON.object_list[i].object, "w");
request('http://bcs.duapp.com/你的bucket名'+ bodyJSON.object_list[i].object + '?sign=' + sign).pipe(fs.createWriteStream('./' + bodyJSON.object_list[i].object));
}}
}
});

注意因为是顺序执行,所以这里用的都是 Sync 版的 fs 函数。
由于本人的 BCS 里总文件个数不到 200 个,所以没有给 RESTful API 传更多的参数,要求分页传回更多的文件信息。

5.完成

将本节所有代码按顺序复制粘贴另存为后缀是 .js 的文本文件,修改成你自己的信息后,直接运行
node 你的文件名
运行完就会看到所有文件都在那了。

参考文档