application.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. 'use strict';
  2. const szjcomoutils = require('szjcomo-utils');
  3. const fs = require('fs');
  4. const path = require('path');
  5. const xml2js = require('xml2js');
  6. const crypto = require('crypto');
  7. const BAR = Symbol('Application#szjcomo');
  8. const mime = require('mime');
  9. /**
  10. * [mkdir 创建目录]
  11. * @author szjcomo
  12. * @createTime 2020-09-04
  13. * @param {[type]} dirname [description]
  14. * @param {Object} options [description]
  15. * @return {[type]} [description]
  16. */
  17. const mkdir = function(dirpath,options = {recursive:true}) {
  18. if (fs.existsSync(dirpath)) {
  19. return true;
  20. } else {
  21. return fs.mkdirSync(dirpath,options);
  22. }
  23. }
  24. /**
  25. * [deleteFile 删除文件]
  26. * @author szjcomo
  27. * @createTime 2020-09-04
  28. * @param {[type]} filename [description]
  29. * @return {[type]} [description]
  30. */
  31. const deleteFile = function(filename) {
  32. if (!fs.existsSync(filename)) {
  33. return true;
  34. } else {
  35. fs.unlinkSync(filename);
  36. return true;
  37. }
  38. }
  39. /**
  40. * [fileSize 获取文件或文件夹大小]
  41. * @author szjcomo
  42. * @createTime 2020-09-04
  43. * @param {[type]} filepath [description]
  44. * @return {[type]} [description]
  45. */
  46. const fileSize = function(filepath) {
  47. if (!fs.existsSync(filepath)) {
  48. return 0;
  49. } else {
  50. return fs.statSync(filepath).size;
  51. }
  52. }
  53. /**
  54. * [parseXml xml解析]
  55. * @author szjcomo
  56. * @createTime 2020-09-04
  57. * @param {[type]} xmlContent [description]
  58. * @return {[type]} [description]
  59. */
  60. const parseXml = function(xmlContent) {
  61. return new Promise((resolve, reject) => {
  62. const parseString = xml2js.parseString;
  63. parseString(xmlContent, { explicitArray: false }, (err, json) => {
  64. if (json) {
  65. resolve(json.xml);
  66. } else {
  67. reject(err);
  68. }
  69. });
  70. });
  71. }
  72. /**
  73. * [createXml 对象转xml]
  74. * @author szjcomo
  75. * @createTime 2020-09-04
  76. * @param {[type]} obj [description]
  77. * @return {[type]} [description]
  78. */
  79. const createXml = function(obj) {
  80. const builder = new xml2js.Builder({
  81. rootName: 'xml',
  82. headless: true,
  83. cdata: true,
  84. });
  85. return builder.buildObject(obj);
  86. }
  87. /**
  88. * [MD5 原生nodejs的md5算法]
  89. * @author szjcomo
  90. * @createTime 2020-09-04
  91. * @param {[type]} str [description]
  92. */
  93. const MD5 = function(str) {
  94. return crypto.createHash('md5').update(str).digest('hex').toLowerCase();
  95. }
  96. /**
  97. * [SHA1 获取加密的sha1的值 基于nodejs]
  98. * @author szjcomo
  99. * @createTime 2020-09-04
  100. * @param {[type]} str [description]
  101. */
  102. const SHA1 = function(str) {
  103. return crypto.createHash('sha1').update(str).digest('hex').toLowerCase();
  104. }
  105. /**
  106. * [FileMD5 文件的md5值]
  107. * @author szjcomo
  108. * @createTime 2020-09-04
  109. * @param {[type]} filepath [description]
  110. */
  111. const FileMD5 = function(filename) {
  112. if(!fs.existsSync(filename)) throw new Error(`${filename}不存在`);
  113. var buffer = fs.readFileSync(filename);
  114. return crypto.createHash('md5').update(buffer).digest('hex').toLowerCase();
  115. }
  116. /**
  117. * [FileSHA1 文件的sha1值]
  118. * @author szjcomo
  119. * @createTime 2020-09-04
  120. * @param {[type]} filename [description]
  121. */
  122. const FileSHA1 = function(filename) {
  123. if(!fs.existsSync(filename)) throw new Error(`${filename}不存在`);
  124. var buffer = fs.readFileSync(filename);
  125. return crypto.createHash('sha1').update(buffer).digest('hex').toLowerCase();
  126. }
  127. /**
  128. * [deleteFolder 删除文件夹]
  129. * @author szjcomo
  130. * @date 2020-11-10
  131. * @param {[type]} folder_path [description]
  132. * @return {[type]} [description]
  133. */
  134. const deleteFolder = function(folder_path) {
  135. let files = [];
  136. if( fs.existsSync(folder_path) ) {
  137. files = fs.readdirSync(folder_path);
  138. files.forEach(function(file,index){
  139. let curPath = path.join(folder_path,file);
  140. if(fs.statSync(curPath).isDirectory()) { // recurse
  141. deleteFolder(curPath);
  142. } else { // delete file
  143. fs.unlinkSync(curPath);
  144. }
  145. });
  146. fs.rmdirSync(folder_path);
  147. }
  148. }
  149. /**
  150. * [FileToBase64 文件转base64]
  151. * @author szjcomo
  152. * @date 2020-11-11
  153. * @param {[type]} filename [description]
  154. */
  155. const FileToBase64 = function(filename) {
  156. if(!fs.existsSync(filename)) throw new Error('文件不存在');
  157. let bitmap = fs.readFileSync(filename);
  158. let data = Buffer.from(bitmap, 'binary').toString("base64");
  159. let base64 = 'data:' + mime.getType(filename) + ';base64,' + data;
  160. return base64;
  161. }
  162. /**
  163. * [getBase64FileType 获取base64文件的类型]
  164. * @author szjcomo
  165. * @date 2020-11-11
  166. * @param {[type]} filetype [description]
  167. * @return {[type]} [description]
  168. */
  169. const getBase64FileType = function(filetype) {
  170. let result;
  171. let maps = {
  172. 'data:application/msword;base64,':'.doc',
  173. 'data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,':'.docx',
  174. 'data:application/vnd.ms-excel;base64,':'.xls',
  175. 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,':'.xlsx',
  176. 'data:application/pdf;base64,':'.pdf',
  177. 'data:application/vnd.ms-powerpoint;base64,':'.ppt',
  178. 'data:application/vnd.openxmlformats-officedocument.presentationml.presentation;base64,':'.pptx',
  179. 'data:text/plain;base64,':'.txt',
  180. 'data:image/png;base64,':'.png',
  181. 'data:image/jpeg;base64,':'.jpg',
  182. 'data:image/svg+xml;base64,':'.svg',
  183. 'data:image/x-icon;base64,':'.ico',
  184. 'data:image/bmp;base64,':'.bmp',
  185. 'data:application/json;base64,':'.json',
  186. 'data:text/markdown;base64,':'.md',
  187. 'data:application/javascript;base64,':'.js'
  188. };
  189. return maps[filetype]?maps[filetype]:null;
  190. }
  191. /**
  192. * [Base64ToFile base64字符串转文件]
  193. * @author szjcomo
  194. * @date 2020-11-11
  195. * @param {[type]} base64 [description]
  196. * @param {[type]} savePath [description]
  197. * @param {[type]} filename [description]
  198. */
  199. const Base64ToFile = function(base64,savePath,filename = null) {
  200. let reg = /data:(.*);base64,/;
  201. let result = reg.exec(base64);
  202. if(!result || !result[0]) throw new Error('不是标准的base64格式');
  203. if(!savePath) throw new Error('文件保存路径参数未设置,请检查');
  204. if(!filename) {
  205. let ext = getBase64FileType(result[0]);
  206. if(!ext) throw new Error('未知的文件类型');
  207. filename = `${szjcomoutils.date('YmdHis')}${szjcomoutils.mt_rand(100000,999999)}${ext}`;
  208. }
  209. let filepath = path.join(savePath,filename);
  210. mkdir(savePath);
  211. let filedata = base64.replace(/^data:(.*);base64,/,'');
  212. let buffer = Buffer.from(filedata, 'base64');
  213. fs.writeFileSync(filepath,buffer);
  214. if(fs.existsSync(filepath)) return filepath;
  215. return false;
  216. }
  217. /**
  218. * [exports 扩展app对象]
  219. * @type {Object}
  220. */
  221. module.exports = {
  222. /**
  223. * [szjcomo 获取对象]
  224. * @author szjcomo
  225. * @createTime 2020-09-04
  226. * @return {[type]} [description]
  227. */
  228. get szjcomo() {
  229. if (!this[BAR]) {
  230. this[BAR] = Object.assign(szjcomoutils,{
  231. MD5:MD5,
  232. SHA1:SHA1,
  233. FileMD5:FileMD5,
  234. FileSHA1:FileSHA1,
  235. deleteFile:deleteFile,
  236. mkdir:mkdir,
  237. parseXml:parseXml,
  238. createXml:createXml,
  239. deleteFolder:deleteFolder,
  240. FileSize:fileSize,
  241. FileToBase64:FileToBase64,
  242. Base64ToFile:Base64ToFile
  243. });
  244. }
  245. return this[BAR];
  246. }
  247. };