node复制文件夹,压缩zip,上传

一:用到的模块和简单介绍 npm文档;
request :node请求的模块,可以给用程序请求服务器的接口
https://www.npmjs.com/package/request
fs:读写文件的,很常用
https://www.npmjs.com/package/fs
path:路径,各种给文件夹弄路径什么的
https://www.npmjs.com/package/path
js-cookie:获取cokie的,在请求的时候需要用到
https://www.npmjs.com/package/js-cookie
node-native-zip:压缩zip的模块

//公共引入模块;
const path = require("path");
const fs = require("fs");
var request = require("request");
var zip = require("node-native-zip");

  

二:复制文件夹;
项目背景:
有个项目的绝对路径;
e:/183svn/appstore183
其中appstore183就是app的更目录了,里面就是各种代码,需要把这个代码压缩zip 然后上传到指定服务器;
但是压缩的zip的格式有要是,必须为 appid.zip,这里的appid就是项目的唯一id,是一堆数字,假设
appid=123456789;
压缩的zip就是 123456789.zip,里面的结构是
123456789/appstor183/下面就是代码了
所以 原来的路径 e:/183svn/appstore183 不符合要求,所以选复制成我需要的路径

第一步复制:
由于zip结构包的需要 所以我需要的复制的最后路径为
e:/183svn/appstore183/123456789/123456789/appstore183/下面是各种代码文件;
代码实现如下:
var appid=opt.appid;//123456789
var localPath=APICloudStudio.localProjects[0].localPath;//项目目录 E:\183svn\appstore183
//注appid,localPath都是其他程序获取的值或者cookie给的,这里先认为写死;
var pathrr=localPath.split('\\');
var appDirPath =pathrr[pathrr.length-1];//项目名称 //appstore183
var appParentDirPath =localPath.replace('\\'+appDirPath,'');//项目父名称 //E:\183svn
//注:这里用了js的拆分字符串的方法获取路径,很麻烦,可以直接用path模块的方法 
  
//拷贝项目目录到临时目录中
let containerDir0 = path.join(appParentDirPath,appid);//E:\183svn\123456789
let containerDir = path.join(containerDir0,appid);//E:\183svn\123456789 这个是要复制的目标目录
if (fs.existsSync(containerDir0)){
  //已经创建此目录了 删除
  if (fs.statSync(containerDir0).isDirectory()) {
    deleteFolderRecursive(containerDir0);
  } else {
    fs.unlinkSync(containerDir0);
  }
}
if (fs.existsSync(containerDir)){
  //已经创建此目录了 删除
  if (fs.statSync(containerDir).isDirectory()) {
    deleteFolderRecursive(containerDir);
  } else {
    fs.unlinkSync(containerDir);
  }
}
fs.mkdirSync(containerDir0);//创建目录
fs.mkdirSync(containerDir);//创建目录
let copy = function(src, dst) {
  //读取目录中的所有文件/目录
  let paths = fs.readdirSync(src);
  paths.forEach(function(item){
    let _src = path.join(src, item);
    let _dst = path.join(dst, item);
    let readable,writable;
    if (fs.statSync(_src).isDirectory()) {
      //is directory
      exists(_src, _dst, copy);
    } else {
      //is file
      readable = fs.createReadStream(_src);
      writable = fs.createWriteStream(_dst);
      readable.pipe(writable);
    }
  });
};
let exists = function(src, dst, callback) {
  if (fs.existsSync(dst)) {
    callback(src, dst);
  } else {
    fs.mkdirSync(dst);
    callback(src, dst);
  }
};
let copyTree = function(src, dst) {
  let objsrc = path.parse(src);
  let dirName = objsrc.name;
  let targetDir = path.join(dst, dirName);
  if (fs.existsSync(targetDir)) {
    if (fs.statSync(targetDir).isDirectory()) {
      deleteFolderRecursive(targetDir);
    } else {
      fs.unlinkSync(targetDir);
    }
  }
  fs.mkdirSync(targetDir);

  copy(src, targetDir);
};
copyTree(localPath, containerDir);
function deleteFolderRecursive(path) {
  let files = [];
  if( fs.existsSync(path) ) {
    files = fs.readdirSync(path);
    files.forEach(function(file,index){
      let curPath = path + "/" + file;
      if(fs.statSync(curPath).isDirectory()) { // recurse
        deleteFolderRecursive(curPath);
      } else { // delete file
        fs.unlinkSync(curPath);
      }
    });
    fs.rmdirSync(path);
  }
}
//拷贝项目目录到临时目录中 end
这里复制就完成了,而且这个也复制了隐藏的文件夹和下面的文件

  

第二步:压缩zip
//压缩临时目录
var outputPath=path.join(path.dirname(containerDir),appid+'.zip');//输出zip路径 //E:183svn/123456789.zip 这里是配置把zip文件压缩到的目录和名字
//要压缩文件夹所在的父目录
let pathToZipDir = path.dirname(containerDir); //'E:183svn/123456789/';
//注:代码文件现在的路径是 'E:183svn/123456789/123456789/appstore183/里面一堆文件 为了压缩的zip里面多一层123456789文件夹 所以压缩文件的父父母跳两层
//要压缩文件夹所在的最后一层目录
let dirToZip = appid; // 123456789/appstore183';//就是一堆文件的路径,同样为了zip包的格式 这里多了一层 123456789文件夹
(function () {
  let zip = require("node-native-zip");
  let archive = new zip();
  (function addFile(filepath) {
    if(fs.lstatSync(filepath).isDirectory()) {
      let directory = fs.readdirSync(filepath);
      directory.forEach(function(subfilepath){
        addFile(path.join(filepath,subfilepath));
      });
    } else {
      archive.add(path.relative(pathToZipDir, filepath), fs.readFileSync(filepath, 'binary'));
    }
  })(path.join(pathToZipDir, dirToZip));
  let buff = archive.toBuffer();
  fs.writeFile(outputPath, buff, function () {
    console.log("压缩 finished");
    console.log('压缩包路径:'+outputPath);
   //第三部 //上传zip
//上传用request模块,格式和jq的ajax感觉差不多让我特别喜欢,哈哈 直接请求个接口;formDtata里面的file文件用fs读成流的形式,duang的一下子上传
    request({
      url: `${window.location.origin}/api2/upload`,
      method:"POST",
      formData: {
        upload_type: "zip",
        file: fs.createReadStream(outputPath)
      },
      headers:{
        "cookie": opt.cookie//其他发送获取的cookie 
      }
    },function (err, response, body) {
//回调里面处理成功和失败
      if(err){
        console.log(err);
      }else{
        callback(JSON.parse(body).result.path);
      }
    })
  });
}());
//压缩临时目录end

  总的来说 ,都是抄的百度到的代码和参考项目里面前辈的代码实现的,功能是实现了,但是肯定不是最优的做法,也希望有更好解决办法的大大佬们带飞

posted @ 2017-06-16 21:30  fstgshow  阅读(992)  评论(0编辑  收藏  举报