一:用到的模块和简单介绍 npm文档;
request :node请求的模块,可以给用程序请求服务器的接口
https://www.npmjs.com/package/requestfs:读写文件的,很常用
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
总的来说 ,都是抄的百度到的代码和参考项目里面前辈的代码实现的,功能是实现了,但是肯定不是最优的做法,也希望有更好解决办法的大大佬们带飞