'use strict'; const szjcomoutils = require('szjcomo-utils'); const fs = require('fs'); const path = require('path'); const xml2js = require('xml2js'); const crypto = require('crypto'); const BAR = Symbol('Application#szjcomo'); const mime = require('mime'); /** * [mkdir 创建目录] * @author szjcomo * @createTime 2020-09-04 * @param {[type]} dirname [description] * @param {Object} options [description] * @return {[type]} [description] */ const mkdir = function(dirpath,options = {recursive:true}) { if (fs.existsSync(dirpath)) { return true; } else { return fs.mkdirSync(dirpath,options); } } /** * [deleteFile 删除文件] * @author szjcomo * @createTime 2020-09-04 * @param {[type]} filename [description] * @return {[type]} [description] */ const deleteFile = function(filename) { if (!fs.existsSync(filename)) { return true; } else { fs.unlinkSync(filename); return true; } } /** * [fileSize 获取文件或文件夹大小] * @author szjcomo * @createTime 2020-09-04 * @param {[type]} filepath [description] * @return {[type]} [description] */ const fileSize = function(filepath) { if (!fs.existsSync(filepath)) { return 0; } else { return fs.statSync(filepath).size; } } /** * [parseXml xml解析] * @author szjcomo * @createTime 2020-09-04 * @param {[type]} xmlContent [description] * @return {[type]} [description] */ const parseXml = function(xmlContent) { return new Promise((resolve, reject) => { const parseString = xml2js.parseString; parseString(xmlContent, { explicitArray: false }, (err, json) => { if (json) { resolve(json.xml); } else { reject(err); } }); }); } /** * [createXml 对象转xml] * @author szjcomo * @createTime 2020-09-04 * @param {[type]} obj [description] * @return {[type]} [description] */ const createXml = function(obj) { const builder = new xml2js.Builder({ rootName: 'xml', headless: true, cdata: true, }); return builder.buildObject(obj); } /** * [MD5 原生nodejs的md5算法] * @author szjcomo * @createTime 2020-09-04 * @param {[type]} str [description] */ const MD5 = function(str) { return crypto.createHash('md5').update(str).digest('hex').toLowerCase(); } /** * [SHA1 获取加密的sha1的值 基于nodejs] * @author szjcomo * @createTime 2020-09-04 * @param {[type]} str [description] */ const SHA1 = function(str) { return crypto.createHash('sha1').update(str).digest('hex').toLowerCase(); } /** * [FileMD5 文件的md5值] * @author szjcomo * @createTime 2020-09-04 * @param {[type]} filepath [description] */ const FileMD5 = function(filename) { if(!fs.existsSync(filename)) throw new Error(`${filename}不存在`); var buffer = fs.readFileSync(filename); return crypto.createHash('md5').update(buffer).digest('hex').toLowerCase(); } /** * [FileSHA1 文件的sha1值] * @author szjcomo * @createTime 2020-09-04 * @param {[type]} filename [description] */ const FileSHA1 = function(filename) { if(!fs.existsSync(filename)) throw new Error(`${filename}不存在`); var buffer = fs.readFileSync(filename); return crypto.createHash('sha1').update(buffer).digest('hex').toLowerCase(); } /** * [deleteFolder 删除文件夹] * @author szjcomo * @date 2020-11-10 * @param {[type]} folder_path [description] * @return {[type]} [description] */ const deleteFolder = function(folder_path) { let files = []; if( fs.existsSync(folder_path) ) { files = fs.readdirSync(folder_path); files.forEach(function(file,index){ let curPath = path.join(folder_path,file); if(fs.statSync(curPath).isDirectory()) { // recurse deleteFolder(curPath); } else { // delete file fs.unlinkSync(curPath); } }); fs.rmdirSync(folder_path); } } /** * [FileToBase64 文件转base64] * @author szjcomo * @date 2020-11-11 * @param {[type]} filename [description] */ const FileToBase64 = function(filename) { if(!fs.existsSync(filename)) throw new Error('文件不存在'); let bitmap = fs.readFileSync(filename); let data = Buffer.from(bitmap, 'binary').toString("base64"); let base64 = 'data:' + mime.getType(filename) + ';base64,' + data; return base64; } /** * [getBase64FileType 获取base64文件的类型] * @author szjcomo * @date 2020-11-11 * @param {[type]} filetype [description] * @return {[type]} [description] */ const getBase64FileType = function(filetype) { let result; let maps = { 'data:application/msword;base64,':'.doc', 'data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,':'.docx', 'data:application/vnd.ms-excel;base64,':'.xls', 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,':'.xlsx', 'data:application/pdf;base64,':'.pdf', 'data:application/vnd.ms-powerpoint;base64,':'.ppt', 'data:application/vnd.openxmlformats-officedocument.presentationml.presentation;base64,':'.pptx', 'data:text/plain;base64,':'.txt', 'data:image/png;base64,':'.png', 'data:image/jpeg;base64,':'.jpg', 'data:image/svg+xml;base64,':'.svg', 'data:image/x-icon;base64,':'.ico', 'data:image/bmp;base64,':'.bmp', 'data:application/json;base64,':'.json', 'data:text/markdown;base64,':'.md', 'data:application/javascript;base64,':'.js' }; return maps[filetype]?maps[filetype]:null; } /** * [Base64ToFile base64字符串转文件] * @author szjcomo * @date 2020-11-11 * @param {[type]} base64 [description] * @param {[type]} savePath [description] * @param {[type]} filename [description] */ const Base64ToFile = function(base64,savePath,filename = null) { let reg = /data:(.*);base64,/; let result = reg.exec(base64); if(!result || !result[0]) throw new Error('不是标准的base64格式'); if(!savePath) throw new Error('文件保存路径参数未设置,请检查'); if(!filename) { let ext = getBase64FileType(result[0]); if(!ext) throw new Error('未知的文件类型'); filename = `${szjcomoutils.date('YmdHis')}${szjcomoutils.mt_rand(100000,999999)}${ext}`; } let filepath = path.join(savePath,filename); mkdir(savePath); let filedata = base64.replace(/^data:(.*);base64,/,''); let buffer = Buffer.from(filedata, 'base64'); fs.writeFileSync(filepath,buffer); if(fs.existsSync(filepath)) return filepath; return false; } /** * [exports 扩展app对象] * @type {Object} */ module.exports = { /** * [szjcomo 获取对象] * @author szjcomo * @createTime 2020-09-04 * @return {[type]} [description] */ get szjcomo() { if (!this[BAR]) { this[BAR] = Object.assign(szjcomoutils,{ MD5:MD5, SHA1:SHA1, FileMD5:FileMD5, FileSHA1:FileSHA1, deleteFile:deleteFile, mkdir:mkdir, parseXml:parseXml, createXml:createXml, deleteFolder:deleteFolder, FileSize:fileSize, FileToBase64:FileToBase64, Base64ToFile:Base64ToFile }); } return this[BAR]; } };