UNPKG

doomi-helper

Version:

Doomisoft NodeJs Common Utilities

264 lines (261 loc) 11.2 kB
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;