Advertisement
Guest User

Untitled

a guest
Mar 12th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.82 KB | None | 0 0
  1. const FTP = require("ftp");
  2. const _ = require('lodash');
  3. const async = require("async");
  4. const glob = require('glob');
  5. const logging = 'debug';
  6. const fs = require("fs");
  7. const MAX_CONNECTIONS = 10;
  8. const loggingLevels = ['none', 'basic', 'debug'];
  9. const log = function (msg, lvl) {
  10. if (loggingLevels.indexOf(lvl) <= loggingLevels.indexOf(logging)) {
  11. console.log(msg);
  12. }
  13. };
  14.  
  15. class FTPClient {
  16. constructor(config, option) {
  17. this.config = _.defaults(config || {}, {
  18. host: '172.16.37.28',
  19. port: 21,
  20. user: 'zx',
  21. password: 'ZX@spider_1620'
  22. });
  23. this.option = _.defaults(option || {}, {
  24. overwrite: 'older' // | 'all' | 'none'
  25. });
  26. this.ftp = new FTP();
  27. this.ftp.on('error', function (err) {
  28. throw new Error(err);
  29. });
  30. }
  31.  
  32. connect(callback) {
  33. this.ftp.on('ready', () => {
  34. log('Connected to ' + this.config.host, 'debug');
  35. if (typeof callback !== 'undefined') {
  36. callback();
  37. }
  38. });
  39.  
  40. this.ftp.connect(this.config || {});
  41. }
  42.  
  43. upload(patterns, dest, options, uploadCallback) {
  44. options = _.defaults(options || {}, this.option);
  45. let paths, files, dirs, toDelete = [], ftp = this.ftp;
  46. paths = this._glob(patterns);
  47. paths = this._clean(paths, options.baseDir);
  48. paths = this._stat(paths);
  49. files = paths[1];
  50. dirs = paths[0];
  51.  
  52. const deleteFiles = function (cb) {
  53. async.eachLimit(toDelete, MAX_CONNECTIONS, function (file, callback) {
  54. let destPath = (file.src.indexOf(options.baseDir) === 0 ?
  55. file.src.substring(options.baseDir.length + 1) : file.src);
  56.  
  57. log('Deleting ' + destPath, 'debug');
  58.  
  59. if (file.isDirectory()) {
  60. ftp.rmdir(destPath, function (err) {
  61. if (err) {
  62. log(err, 'debug');
  63. }
  64. callback();
  65. });
  66. } else {
  67. ftp.delete(destPath, function (err) {
  68. if (err) {
  69. log(err, 'debug');
  70. }
  71. callback();
  72. });
  73. }
  74. }, cb);
  75. };
  76.  
  77. const uploadFiles = function (cb) {
  78. async.eachLimit(files, MAX_CONNECTIONS, (file, callback) => {
  79. let destFileName = (file.src.indexOf(options.baseDir) === 0 ?
  80. file.src.substring(options.baseDir.length + 1) : file.src);
  81. log('Uploading file ' + destFileName, 'debug');
  82. ftp.put(file.src, dest + '/' + destFileName, (err) => {
  83. if (err) {
  84. log('Error uploading file ' + destFileName + ': ' + err, 'basic');
  85. file.uploaded = false;
  86. file.error = err;
  87. } else {
  88. log('Finished uploading file ' + destFileName, 'basic');
  89. file.uploaded = true;
  90. }
  91. callback();
  92. });
  93. }, cb);
  94. };
  95.  
  96. const uploadDirs = function (cb) {
  97. async.eachLimit(dirs, MAX_CONNECTIONS, (dir, callback) => {
  98. let destPath = (dir.src.indexOf(options.baseDir) === 0 ?
  99. dir.src.substring(options.baseDir.length + 1) : dir.src);
  100.  
  101. log('Uploading directory ' + destPath, 'debug');
  102.  
  103. ftp.mkdir(destPath, (err) => {
  104. if (err) {
  105. log('Error uploading directory ' + destPath + ': ' + err, 'basic');
  106. dir.uploaded = false;
  107. dir.error = err;
  108. } else {
  109. log('Finished uploading directory ' + destPath, 'basic');
  110. dir.uploaded = true;
  111. }
  112. callback();
  113. })
  114. }, cb);
  115. };
  116.  
  117. this._cwd(dest, function () {
  118. log('Moved to directory ' + dest, 'debug');
  119. let tasks = [];
  120.  
  121. tasks.push(function (callback) {
  122. log('Delete files', 'debug');
  123. return deleteFiles(function (err) {
  124. if (err) {
  125. log(err, 'debug');
  126. }
  127. callback();
  128. });
  129. });
  130.  
  131. tasks.push(function (callback) {
  132. log('Upload files', 'debug');
  133. return uploadFiles(function (err) {
  134. if (err) {
  135. log(err, 'debug');
  136. }
  137. else log('Uploaded files', 'debug');
  138. callback();
  139. });
  140. });
  141.  
  142. async.series(tasks, function (err) {
  143. if (err) throw err;
  144. ftp.end();
  145. log('Upload done', 'debug');
  146. let result = {
  147. uploadedFiles: [],
  148. uploadedDirs: [],
  149. errors: {}
  150. };
  151. dirs.forEach(function (dir) {
  152. if (dir.uploaded) {
  153. result.uploadedDirs.push(dir.src);
  154. } else {
  155. result.errors[dir.src] = dir.error;
  156. }
  157. });
  158. files.forEach(function (file) {
  159. if (file.uploaded) {
  160. result.uploadedFiles.push(file.src);
  161. } else {
  162. result.errors[file.src] = file.error;
  163. }
  164. });
  165. log('Finished uploading ' + result.uploadedFiles.length + ' of ' + files.length + ' files.', 'basic');
  166. uploadCallback(result);
  167. });
  168.  
  169. })
  170. }
  171.  
  172. _clean(files, baseDir) {
  173. if (!baseDir) {
  174. return files;
  175. }
  176.  
  177. return _.compact(_.map(files, (file) => {
  178. if (file.replace(baseDir, '')) {
  179. return file;
  180. } else {
  181. return null;
  182. }
  183. }));
  184. }
  185.  
  186. _stat(files) {
  187. let result = [
  188. [],
  189. []
  190. ];
  191. _.each(files, function (file) {
  192. file = _.extend(fs.statSync(file), {src: file});
  193. if (file.isDirectory()) {
  194. result[0].push(file);
  195. } else {
  196. result[1].push(file);
  197. }
  198. });
  199. return result;
  200. }
  201.  
  202. /**
  203. * 搜索文件夹下所有文件
  204. * @param patterns 文件正则
  205. * @returns {*}
  206. * @private
  207. */
  208. _glob(patterns) {
  209. let include = [],
  210. exclude = [];
  211.  
  212. if (!_.isArray(patterns)) {
  213. patterns = [patterns];
  214. }
  215. patterns.forEach(function (pattern) {
  216. if (pattern.indexOf('!') === 0) {
  217. exclude = exclude.concat(glob.sync(pattern.substring(1), {nonull: false}) || []);
  218. } else {
  219. include = include.concat(glob.sync(pattern, {nonull: false}) || []);
  220. }
  221. });
  222.  
  223. return _.difference(include, exclude);
  224. }
  225.  
  226. /**
  227. * 切换到指定路径
  228. * @param path
  229. * @param callback
  230. * @private
  231. */
  232. _cwd(path, callback) {
  233. this.ftp.mkdir(path, true, (err) => {
  234. if (err) {
  235. log(err, 'debug');
  236. }
  237. this.ftp.cwd(path, function (err) {
  238. if (err) log(err, 'debug');
  239. callback();
  240. });
  241. });
  242. }
  243. }
  244.  
  245. module.exports = FTPClient;
  246.  
  247. const client = new Ftpclient();
  248.  
  249. client.connect(function () {
  250. client.upload(['E:/test//**'], '/media/test', {
  251. baseDir: 'E:/test/',
  252. overwrite: 'older'
  253. }, function (result) {
  254. console.log(result);
  255. });
  256. })
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement