doomi-helper
Version:
Doomisoft NodeJs Common Utilities
264 lines (261 loc) • 11.2 kB
JavaScript
const fs = require('fs');
const path = require('path');
const moment = require('moment');
const uuid = require('node-uuid');
const querystring = require("querystring")
const urlUtility = require('url');
const utility = require('../utilities')
class File {
/**
* 根据DoomiSoft框架生成的唯一文件名,用户上传后的文件存储后名称,防止重复
* @param {*} saveOption
* @param {*} fileName
* @param {*} userInfo
*/
static getSaveFileName(saveOption, fileName, userInfo = null) {
let subFolder = '';
///分目录存储
switch ((saveOption.subFolder || '').toLowerCase()) {
///按日建造一个目录
case 'onebydate': subFolder = moment().format('YYYYMMDD'); break;
///按日建造多级目录
case 'mutilbydate': subFolder = moment().year() + '/' + moment().month() + '/' + moment().day(); break;
///用自己的id(当前登录的id)建造目录
case 'identity': subFolder = userInfo ? userInfo.id : uuid.v4(); break;
}
let saveFolder = path.join(saveOption.saveDir, subFolder+'');
if (userInfo && userInfo.subfolder) saveFolder = path.join(saveFolder, userInfo.subfolder);
///如果包含当前调用用户的信息,则替换整个路径中的@@关键字
if (userInfo){
var matched=saveFolder.match(/@.*?@/g);
if (matched && matched.length>0)
matched.forEach(ele=>{
var matchValue = ele.substring(1,ele.length-1);
if (matchValue.indexOf(' ')>=0 || matchValue.indexOf(':')>=0 || matchValue.indexOf('=')>=0) return;
let keyName = ele.substring(1,ele.length-1);
var keyValue = utility.ifNull(userInfo[keyName],'');
saveFolder = saveFolder.replace(ele,keyValue);
});
}
try {
let _fileName;
switch ((saveOption.fileName || 'keep').toLowerCase()) {
///保持和原有文件一致的文件名
case "keep": _fileName = fileName; break;
///随机命名,但后缀必须一致
case "random": _fileName = uuid.v4() + path.extname(fileName); break;
///使用当前账号的id命名
case "identity": _fileName = (userInfo ? userInfo.id : uuid.v4()) + path.extname(fileName); break;
}
return path.join(saveFolder, _fileName);
} catch (err) {
return null;
}
}
/**
* 获取文件需要保存的目录
* @param {*} saveOption
* @param {*} fileName
* @param {*} userInfo
*/
static getSaveFoler(saveOption,userInfo = null) {
let subFolder = '';
///分目录存储
switch ((saveOption.subFolder || '').toLowerCase()) {
///按日建造一个目录
case 'onebydate': subFolder = moment().format('YYYYMMDD'); break;
///按日建造多级目录
case 'mutilbydate': subFolder = moment().year() + '/' + moment().month() + '/' + moment().day(); break;
///用自己的id(当前登录的id)建造目录
case 'identity': subFolder = userInfo ? userInfo.id : uuid.v4(); break;
}
let saveFolder = path.join(saveOption.saveDir, subFolder+'');
if (userInfo && userInfo.subfolder) saveFolder = path.join(saveFolder, userInfo.subfolder);
///如果包含当前调用用户的信息,则替换整个路径中的@@关键字
if (userInfo){
var matched=saveFolder.match(/@.*?@/g);
if (matched && matched.length>0)
matched.forEach(ele=>{
var matchValue = ele.substring(1,ele.length-1);
if (matchValue.indexOf(' ')>=0 || matchValue.indexOf(':')>=0 || matchValue.indexOf('=')>=0) return;
let keyName = ele.substring(1,ele.length-1);
var keyValue = utility.ifNull(userInfo[keyName],'');
saveFolder = saveFolder.replace(ele,keyValue);
});
}
return saveFolder;
}
/**
* 获取上传的文件仅包含文件名
* @param {*} saveOption
* @param {*} fileName
* @param {*} userInfo
*/
static getSaveOnlyFileName(saveOption, fileName, userInfo = null) {
try {
let _fileName;
switch ((saveOption.fileName || 'keep').toLowerCase()) {
///保持和原有文件一致的文件名
case "keep": _fileName = fileName; break;
///随机命名,但后缀必须一致
case "random": _fileName = uuid.v4() + path.extname(fileName); break;
///使用当前账号的id命名
case "identity": _fileName = (userInfo ? userInfo.id : uuid.v4()) + path.extname(fileName); break;
}
return _fileName;
} catch (err) {
return null;
}
}
/*
创建多级目录
*/
static mkdirsSync(dirpath, mode) {
if (!fs.existsSync(dirpath)) {
var pathtmp;
var splitPath = dirpath.split(path.sep);
for(var nLoop=0;nLoop<splitPath.length;nLoop++){
var dirname = splitPath[nLoop];
if (dirname.length==0) {
pathtmp="/";
continue;
}
if (pathtmp)
pathtmp = path.join(pathtmp, dirname);
else
pathtmp = dirname;
if (!fs.existsSync(pathtmp)) {
fs.mkdirSync(pathtmp, mode)
}
}
}
return true;
}
/**
* 删除文件夹
* @param {*} path
*/
static deleteFolder(path) {
var files = [];
if( fs.existsSync(path) ) {
files = fs.readdirSync(path);
files.forEach(function(file,index){
var curPath = path + "/" + file;
if(fs.statSync(curPath).isDirectory()) { // recurse
fileUtility.deleteFolder(curPath);
} else { // delete file
fs.unlinkSync(curPath);
}
});
fs.rmdirSync(path);
}
};
static getSaveFileHandler(destination){
switch(destination.toLowerCase()){
case "local": return require('./localsave').getInstance();
case "tencentcos": return require('./txcos').getInstance();
default: return require('./localsave').getInstance();
}
}
///将上传的文件保存到OSS
static uploadFile(saveDestination='tencentcos',fileName, file, saveOption, userInfo, callback){
let fileHandler = this.getSaveFileHandler(saveDestination);
return fileHandler.saveFileStream(fileName, file, saveOption, userInfo, callback);
}
///写字符串内容到存储对象保存为文件
///写字符串内容到存储对象保存为文件
static saveString2File(fileName,bufferData, saveOption, userInfo,saveDestination='tencentcos'){// filePath,bufferData,saveDestination="tencentcos"){
let fileHandler = this.getSaveFileHandler(saveDestination);
return fileHandler.saveString2File(fileName,bufferData,saveOption,userInfo);
}
/**
* 从远程下载文件并保存到腾讯云本地
* @param {*} saveDestination
* @param {*} fileUrl
* @param {*} savesetting
* @param {*} keyid
*/
static downloadFile4upload(saveDestination,fileUrl,savesetting,userinfo,allowWebPFormat = false) {
let originUrl = fileUrl;
///是否允许WebP格式的文件被下载
if(!allowWebPFormat &&fileUrl.indexOf('&tp=webp')>=0) fileUrl = fileUrl.replace('&tp=webp','');
let fileOption = urlUtility.parse(fileUrl);
let filename = path.basename(fileOption.path);
if(filename.indexOf('?')>=0) filename=filename.substr(0,filename.indexOf('?'));
if (path.extname(filename)==''){
let param = querystring.parse(fileOption.query)
if (param.wx_fmt)
filename=filename+"."+param.wx_fmt;
else
filename=filename+".jpeg";
}
const http =fileOption.protocol==='https:'? require('https'):require('http'); //require("../rpc/rpcUtility");
return new Promise((resolve, reject) => {
try{
http.get(fileUrl,(res) => {
var dataArr = [], len = 0;
res.on('data',(chunk)=>{
dataArr.push(chunk);
len += chunk.length;
})
res.on("end", function (err) {
File.uploadFile(saveDestination, filename, Buffer.concat(dataArr, len),savesetting,userinfo, function (file, result) {
result.source = originUrl;
if (result.successed) result.state = "SUCCESS";
resolve(result);
});
});
})
}
catch(err){
console.log('download file error :',err);
reject({successed:false,error:err});
}
})
}
static save2localForRemoteImage(sourceUrlArr, saveOption, userInfo, callback) {
File.promiseAll(sourceUrlArr, saveOption, userInfo).then(function (values) {
callback(null, values);
}).catch(function (err) {
callback(new Error("抓取报错"));
});
}
static promiseAll(urlArr, saveOption, userInfo) {
let promiseArr = [];
for (let url of urlArr) {
try {
promiseArr.push(File.downloadFile4upload('tencentcos',url,saveOption,userInfo))
} catch (error) {
console.log('error happened',error)
}
}
return Promise.all(promiseArr);
}
/**
* 上传本地目录至远程服务器
* @param {*} localFile
* @param {*} saveDestination
* @param {*} savesetting
* @param {*} keyid
*/
static uploadlocalFolder(localFolder,saveDestination,savesetting,keyParam){
var files = [];
if( fs.existsSync(path) ) {
files = fs.readdirSync(path);
files.forEach(function(file,index){
var curPath = path + "/" + file;
if(fs.statSync(curPath).isDirectory()) { // recurse
Utilities.uploadlocalFolder(curPath);
} else { // delete file
//fs.unlinkSync(curPath);
let data = fs.readFileSync(curPath);
File.uploadFile(saveDestination, path.basename(curPath), data,savesetting,keyParam,function (file, result) {
resolve(result);
});
}
});
fs.rmdirSync(path);
}
}
}
exports = module.exports = File;