multer文件上传
https://github.com/expressjs/...
在博客系统中会涉及到文件上传,这时候须要用到 multer文件上传前端
/** * Attachment附件表 * @type {[type]} */ var Sequelize = require('sequelize'); var Mysql = require('./mysql'); var Attachment = Mysql.define('attachment', { uuid: { type: Sequelize.UUID, allowNull: false, primaryKey: true, defaultValue: Sequelize.UUIDV1,//Sequelize.UUIDV4 }, //uuid name: Sequelize.STRING, //附件名字 relativeUrl: Sequelize.STRING, //附件相对地址 absoluteUrl: Sequelize.STRING, //附件绝对地址 type: Sequelize.STRING(2), //附件类型(1图片、2视频、3音频、4其余文件) }, { freezeTableName: true, // 自定义表名 tableName: 'Attachment', timestamps: true, // 添加时间戳属性 (updatedAt, createdAt) createdAt: 'createDate',// 将createdAt字段改个名 updatedAt: 'updateDate',// 将updatedAt字段改个名 indexes: [{ // 索引 type: 'UNIQUE', method: 'BTREE', unique: true, //惟一 fields: ['uuid'], }], }); module.exports = Attachment;
/** * 文件服务 * add by wwj * 2019-05-04 12:03:39 */ var fs = require('fs'); var path = require('path'); //路径 var uuid = require('node-uuid'); //uuid var Promise = require("bluebird"); var multer = require('multer'); //文件上传 var config = require('config-lite'); //配置 module.exports = { /** * 获取年月 */ getYearMonth: function() { var fdate = new Date(); return fdate.getFullYear() + '' + (fdate.getMonth() + 1) + '' + fdate.getDate(); }, /** * 链接文件存放路径 * type文件对应类型 好比文章对应article * filename 文件名含后缀名 */ createFilePath: function(pathType, filename) { var that = this; var fpath = path.join(__dirname, '../public/attchments', (pathType || 'default'), that.getYearMonth()); if (!fs.existsSync(fpath)) { fs.mkdirSync(fpath); } if (filename) { return fpath + '/' + filename; } else { return fpath; } }, /** * 处理文件上传 */ setFileUpload: function(opts) { var that = this; var storage = multer.diskStorage({ //设置上传后文件路径,uploads文件夹会自动建立。 destination: function(req, file, cb) { cb(null, that.createFilePath(opts.pathType)) }, //给上传文件重命名,获取添加后缀名 filename: function(req, file, cb) { var fileFormat = file.originalname.split("."); // cb(null, file.originalname + '_' + Math.ceil(Math.random()*9) + Date.now() + "." + fileFormat[fileFormat.length - 1]); cb(null, uuid() + "." + fileFormat[fileFormat.length - 1]); }, }); var upload = multer({ limits: { fileSize: config.file.limit.fileSize[opts.pathType] || config.file.limit.fileSize.default, //容许最大 }, storage: storage, }); return upload; } }
/** * common controllers * add by wwj * 2016-12-22 17:45:53 */ var co = require('co'); var Promise = require("bluebird"); var i18n = require('i18n'); //国际化 var utils = require('../libs/utils'); //工具类 var Attachment = require('../models/index').Attachment; //房源附件 var fileService = require('../services/file'); //文件服务 module.exports = { /** * 文件上传 */ uploadEnclosure: function(req, res, next) { //文件s var files = req.files; if (!files || !files.length) { //err utils.handleError({ response: res, error: i18n.__('uploadFileFail'), }); return; } co(function*() { //all var fileResult = yield Promise.all(files.map(function(file) { return Attachment.create({ name: file.originalname, //文件名 relativeUrl: file.filename, //相对路径 absoluteUrl: fileService.getFilePath("default", file.filename), type: fileService.handlerFileType(file.mimetype), //对应int值 size: file.size, //文件大小 }); })); //success utils.handleJson({ response: res, msg: i18n.__('uploadFileSuccess'), result: { fileList: fileResult, }, }); }).catch(function(error) { //err utils.handleError({ response: res, error: error, }); }); }, };
后面写到前端的时候再说 怎么ajax fileupload调用node