node复制文件夹,压缩zip,上传
Posted fstgshow
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
总的来说 ,都是抄的百度到的代码和参考项目里面前辈的代码实现的,功能是实现了,但是肯定不是最优的做法,也希望有更好解决办法的大大佬们带飞
以上是关于node复制文件夹,压缩zip,上传的主要内容,如果未能解决你的问题,请参考以下文章