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

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

时间: 2024-08-06 02:35:16

node复制文件夹,压缩zip,上传的相关文章

Windows下如何将一个文件夹通过Git上传到GitHub上(转)

在通过windows系统的电脑上写代码,需要将项目上传到GitHub上去.比如在Pycharm上写Django后端,整个项目是一个文件夹的形式,那么怎么才能这个文件夹通过Git命令上传到GitHub上呢? 以下给出详细步骤: 1.首先得安装git客户端 安装方法很简单,跟安装QQ之类的一样,进入官网:https://git-scm.com/ ,点击右侧下载windows版本的软件包,然后双击安装,一步一步下一步就可以了. 安装完成之后,在开始菜单可以看到如下就算是成功了: 此时,在任一文件夹上右

git忽略相应文件夹,不上传

1.在项目根目录里  右键选择Git Bash 进入命令行 2. touch .gitignore ,生成“.gitignore”文件. 3.  .gitignore文件里输入以下内容.DS_Store node_modules/ 不会再上传 node_modules 文件夹了 原文地址:https://www.cnblogs.com/yigexiaojiangshi/p/10563131.html

PHP递归复制文件夹以及传输文件夹到其他服务器。

项目中需要复制整个文件夹,有时候还需要将整个文件夹传输到远程服务器. 这里就要递归遍历整个文件夹了,想看递归遍历文件夹的代码. function deepScanDir($dir) { $fileArr = array (); $dirArr = array (); $dir = rtrim($dir, '//'); if (is_dir($dir)) { $dirHandle = opendir($dir); while (false !== ($fileName = readdir($dir

vc复制文件夹实现(可以复制三层路径)以及zip压缩实现

#include <boost\filesystem.hpp> #include <KHAboutLocalEnvirTool.h> #include <string> #include "XZip.h" //复制文件夹实现 void copy_all_file(LPCSTR file_path, std_string &backup_path) //第一个参数为被复制文件,第二个是复制到的地址 { if(!(boost::filesyste

C# 压缩 解压 复制文件夹

命名空间:namespace System.IO.Compression 压缩: //目标文件夹 string fileDirPath = "/Downloads/试题" + userId + "_" + courseId; string downPath = Server.MapPath(fileDirPath); if (!Directory.Exists(downPath)) { Directory.CreateDirectory(downPath); } S

定时压缩备份文件(夹)并FTP上传至备份服务器批处理

定时压缩备份文件(夹)并FTP上传至备份服务器(BAT)rem 定时备份文件并FTP上传至备份服务器rem 要备份的文件夹(多个文件夹用空格分开)set bak_webFile=E:\sman\webfile E:\sman\datafilerem 临时文件夹set bak_tmpFile=C:\~SmanTemp\rem 日志文件夹set bak_logPath=C:\~bak_log\rem 生成的rar 文件名set bak_bakFile=YYYYMMDD(页面备份) rem 当前日期(

node.js express fs 获取已上传文件数据格式

{ "fieldName": "photo", "originalFilename": "1395130808991.jpg", "path": "tmpupload/25546-z8u01y.jpg", "headers": { "content-disposition": "form-data; name=\"photo\&

【转】C#打包文件夹成zip格式

原文地址 C#打包文件夹成zip格式(包括文件夹和子文件夹下的所有文件)C#打包zip文件可以调用现成的第三方dll,事半功倍,而且该dll完全免费,下载地址:SharpZipLib下载完解压缩后,把 ICSharpCode.SharpZipLib.dll 拷贝到当前项目的目录下(如果偷懒的话,可以直接拷贝到当前项目的bin\Debug目录下),在VS打开的项目引用上右键添加引用 ICSharpCode.SharpZipLib.dll然后,在VS打开的项目上右键新建一个类,命名为 ZipHelp

【C#公共帮助类】WinRarHelper帮助类,实现文件或文件夹压缩和解压,实战干货

关于本文档的说明 本文档使用WinRAR方式来进行简单的压缩和解压动作,纯干货,实际项目这种压缩方式用的少一点,一般我会使用第三方的压缩dll来实现,就如同我上一个压缩类博客,压缩的是zip文件http://www.cnblogs.com/wohexiaocai/p/5469253.html,实际项目中也会用到rar压缩,所以总结了一下代码,之后简单的几个函数. 欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利. 本人自从几年前走上编程之路,一直致力于收集和总结出好用的框架和通