nodeJs批量上传文件到七牛
昨晚我把七牛的服务限制了一下,被网上刷流量的情况吓着了,看来博客除了域名,其他统统免费爽不是那么容易的。
说批量,肯定是已经有了对应的文件列表,这里我是有的,我用NodeJs处理图片的时候顺便生成了文件路径Json,格式大体如下:
{
"data": [
{
"name": "cs_xihu_20171126/0.jpg",
"type": "pic",
"time": "2017-11-27 9:7:19",
"w": 1125,
"h": 1500
},
{
"name": "cs_xihu_20171126/1.jpg",
"type": "pic",
"time": "2017-11-27 9:7:50",
"w": 1125,
"h": 1500
},
{
"name": "cs_xihu_20171126/2.jpg",
"type": "pic",
"time": "2017-11-27 9:10:8",
"w": 1125,
"h": 1500
}
}
结构就是如此,反正是n多个文件组成,上传对应到七牛的路径,需要用到的就是这个 name 。
然后就是上传需要用到的配置,这些账号信息什么的是必须的:
let opt = {//七牛账号信息——用于上传,详细参数及nodeAPI : https://developer.qiniu.com/kodo/sdk/1289/nodejs
accessKey : '',//sk
secretKey : '',//sk
bucket : '',//文件容器
zone : 'Zone_z0'//空间对应机房区域:华南
}
执行函数:
function uploadQiniu(opt , jsonFile) {//jsonFile对应上传的文件名
let o = opt;
const promise = new Promise(function(resolve, reject) {//获取七牛上传临时uploadToken
let mac = new qiniu.auth.digest.Mac(o.accessKey, o.secretKey);
let options = {
scope: o.bucket
};
let putPolicy = new qiniu.rs.PutPolicy(options);
let uploadToken=putPolicy.uploadToken(mac);
resolve(uploadToken);//返回uploadToken
});
promise.then(function (uploadToken) {//上传图片
// console.log(uploadToken);
let file= jsonFile;
console.log('上传文件对应的json路径:'+file);
let filesData = '';
try{
filesData = JSON.parse(fs.readFileSync( file));
}catch(e){
console.error('需要上传文件的json路径不正确~');
return;
}
if (uploadToken&&filesData&&filesData.data&&filesData.data.length) {//检验是否满足需要上传的条件
var config = new qiniu.conf.Config();
config.zone = qiniu.zone[o.zone];// 空间对应的机房
let formUploader = new qiniu.form_up.FormUploader(config);
let putExtra = new qiniu.form_up.PutExtra();
let dataLen = filesData.data.length;
// 循环文件上传
filesData.data.forEach(function (item,i) {
let localFile = opt.fileOutPath + item.name;
let key= item.name;
formUploader.putFile(uploadToken, key, localFile, putExtra, function(respErr,respBody, respInfo) {
if (respErr) {
throw respErr;
}
if (respInfo.statusCode == 200) {
console.log(item,respBody);
} else {
console.log(respInfo.statusCode);
console.log(item,respBody);
}
if (i === dataLen-1) {
console.log('上传任务结束,共上传处理'+dataLen+'个文件~');
};
});
});
};
});
}
ok,写的可能有点啰嗦,而且我是es5,se6随便写,但是大体就是这样。
更多细节可以参考官方文档: https://developer.qiniu.com/kodo/sdk/1289/nodejs 。