multer文件上传
https://github.com/expressjs/...
在博客系统中会涉及到文件上传,这时候需要用到 multer文件上传
model层
/** * 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;
config层 系统配置
router层
service层
/** * 文件服务 * add by wwj * 2019-05-04 12:03:39 */var fs = require('fs');var path = require('path'); //路径var uuid = require('node-uuid'); //uuidvar 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; }}
controller层文件上传
/** * 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调用