自用nodejs版七牛上传下载功能

Blog GitHub下载

自用功能

自动对比服务器文件上传,自动获取服务器文件下载,获取服务器上所有文件

依赖模块

  • npm install qiniu
  • npm install request
  • npm install underscore

JS中最下方的初始化

AK: 你的七牛AK, 
SK: 你的七牛SK, 
path: 需要同步文件夹以当前文件夹下的文件夹,非绝对路径如:"/uploadQN"指的是当前文件夹下的uploadQN, 
bucket: 你的七牛空间, 
domain: 你的七牛CDN域名 用来下载 

指令

目前仅仅支持get,list,upload

get

nodejs uploadQN.js get 

获取目录下的所有文件以及文件夹

list

nodejs uploadQN.js list 

获取服务器上的所有文件

upload

nodejs uploadQN.js upload 

上传同步文件夹下的所有文件至服务器


学习笔记

本次写这个小功能遇到最大的障碍就是nodejs中的异步循环获取目录比如你的文件夹目录结构为

  • upload– imgs— xxx.png– mm— imgs—- xxx.png

需要做的事情为递归遍历同步文件夹=>异步判断文件是否为文件=>如果是文件夹=>再次递归循环递归来递归去很容易调入一个坑

 
getDir: function (cb) { 
           var path = node_path.join(__dirname, dir_path) 
           var dirs = []; 
           //用来存储最后获得的目录 
           var over_dir=[]; 
           //获取存储最后获得的文件 
           var over=[]; 
           //初始化 
           dirs.push(path); 

           function forFiles(files, file_path) { // 循环目录下所有文件 
               var fixdir = []; 
               var arrlength=files.length; 
               files.forEach(function (e, i) { 
                   var e = node_path.join(file_path,e); 
                   fs.stat(e, function (err, stat) { 
                       arrlength-- 
                       if (stat.isDirectory()) { // 为目录则给over_dir添加目录 
                           fixdir.push(e) 
                           over_dir.push(e) 
                       }else{ // 给over添加文件 
                           over.push(e) 
                       }; 
                       if(arrlength==0){ 
                           if(file_path==over_dir[over_dir.length-1]){ // 当次循环的目录是否等于over_dir的最后一个目录 
                                cb(over,over_dir) 
                           } 
                           if(fixdir.length>0){ //如果获取到文件夹 
                               forDir(fixdir) 
                           } 
                       } 
                    /*   if (i == files.length - 1) { // 当次循环目录结束 

                       }*/ 
                   }) 
               }) 
           } 
           function forDir(dirs) { 
               dirs.forEach(function (e, i) { 
                   fs.readdir(e, function (err, files) { 
                       forFiles(files,e) 
                   }) 
               }) 
           } 
           forDir(dirs) 
       }