var Busboy = require('busboy'); var fs = require('fs'); var fse = require('fs-extra'); var os = require('os'); var path = require('path'); var snowflake = require('node-snowflake').Snowflake; var qn = require('qn'); let FdfsClient = require('fdfs'); var isEmpty = function(obj) { return Object.keys(obj).length === 0 && obj.constructor === Object; } var getFdfs = function(fdfs) { return new FdfsClient({ // tracker servers trackers: [{ host: fdfs.upload.host, port: fdfs.upload.port }], // 默认超时时间10s timeout: fdfs.timeout || 10000, // 默认后缀 // 当获取不到文件后缀时使用 defaultExt: fdfs.defaultExt || 'png', // charset默认utf8 charset: fdfs.charset || 'utf8' }); }; var ueditor = function (static_url, config = {}, handel) { return function (req, res, next) { var _respond = respond(static_url, config, handel); _respond(req, res, next); }; }; var respond = function (static_url, config = {}, callback) { if (typeof config === 'function') { callback = config config = {} } return function (req, res, next) { if (req.query.action === 'config') { callback(req, res, next); return; } else if (req.query.action === 'listimage') { res.ue_list = function (list_dir) { var str = ''; var i = 0; var list = []; fs.readdir(static_url + list_dir, function (err, files) { if (err) throw err; var total = files.length; files.forEach(function (file) { var filetype = 'jpg,png,gif,ico,bmp'; var tmplist = file.split('.'); var _filetype = tmplist[tmplist.length - 1]; if (filetype.indexOf(_filetype.toLowerCase()) >= 0) { var temp = {}; if (list_dir === '/') { temp.url = list_dir + file; } else { temp.url = list_dir + "/" + file; } list[i] = (temp); } else { } i++; // send file name string when all files was processed if (i === total) { res.json({ "state": "SUCCESS", "list": list, "start": 1, "total": total }); } }); }); }; //如果配置了fdfs则从fdfs.list列表读取图片url if (config.fdfs) { res.ue_list = function(list_dir) { fs.readFile(static_url+list_dir+'fdfs.list', function(err, data) { var list = []; if (data) { var dataList = data.toString().split('\n'); dataList.forEach(function(item) { if (item) list.push(JSON.parse(item)) }) } res.json({ "state": 'SUCCESS', "list": list, "start": 1, "total": list.length }) }) } } callback(req, res, next); } else if (req.query.action === 'uploadimage'||req.query.action === 'uploadfile'||req.query.action === 'uploadvideo') { var busboy = new Busboy({ headers: req.headers }); busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { req.ueditor = {}; req.ueditor.fieldname = fieldname; req.ueditor.file = file; req.ueditor.filename = filename; req.ueditor.encoding = encoding; req.ueditor.mimetype = mimetype; res.ue_up = function (img_url) { var tmpdir = path.join(os.tmpdir(), path.basename(filename)); var name = snowflake.nextId() + path.extname(tmpdir); var dest = path.join(static_url, img_url, name); var client = {}; if (config.qn) { client = qn.create(config.qn); client.upload(file, { key: 'ueditor/images/' + name }, function (err, results) { if (err) throw err; res.json({ 'url': results.url, 'title': req.body.pictitle, 'original': filename, 'state': 'SUCCESS' }); }); return false } if (config.fdfs) { var fdfs = getFdfs(config.fdfs); var tempBuffer = []; file.on('data', function (chunk) { tempBuffer.push(chunk); }) file.on('end', function () { var buffer = Buffer.concat(tempBuffer) fdfs.upload(buffer).then(function (fileId) { var result = { 'url': 'http://' + config.fdfs.download.host + '/' + fileId, 'title': req.body && req.body.pictitle || filename, 'original': filename, 'state': 'SUCCESS' }; fse.createFile(path.join(static_url, img_url, 'fdfs.list'), function(err) { if (err) throw err; fs.open(path.join(static_url, img_url, 'fdfs.list'), 'a', function(err, fd) { if (err) throw err; fs.write(fd, '\n'+JSON.stringify(result), function(e) { if (e) throw e; }) }) }) res.json(result) }) .catch(function (err) { if (err) throw err; }) }) } //默认上传到项目目录(config对象为空时) 或者 config.local , config.qn 都为 true 时会同时上传到七牛及项目目录 if (!config || isEmpty(config) || config.local) { var writeStream = fs.createWriteStream(tmpdir); file.pipe(writeStream); writeStream.on("close", function () { fse.move(tmpdir, dest, function (err) { if (err) throw err; res.json({ 'url': path.join(img_url, name).replace(/\\/g,'/'), 'title': req.body.pictitle, 'original': filename, 'state': 'SUCCESS' }); }); }) } }; callback(req, res, next); }); req.pipe(busboy); } else { callback(req, res, next); } return; }; }; module.exports = ueditor;