安装如下包:
npm install multer
npm insatll md5
package versions:
"multer": "^1.1.0",
"md5": "^2.1.0",
使用方法:
/**
*
* @Description 系统服务
* @Author Amor
* @Created 2016/04/27 15:27
* 技术只是解决问题的选择,而不是解决问题的根本...
* 我是Amor,为发骚而生!
*
*/
var express = require('express');
var router = express.Router();
var upload = require('./fileupload');
//文件上传服务
router.post('/upload', upload.single('avatar'), function (req, res, next) {
if (req.file) {
res.send('文件上传成功')
console.log(req.file);
console.log(req.body);
}
});
module.exports = router;
config.js
/**
*
* @Description 系统配置
* @Author Amor
* @Created 2016/04/26 11:48
* 技术只是解决问题的选择,而不是解决问题的根本...
* 我是Amor,为发骚而生!
*
*/
module.exports = {
upload: {
path: process.cwd() + '/uploads'
}
}
fileuploads.js
/**
*
* @Description 文件上传配置
* @Author Amor
* @Created 2016/04/27 17:50
* 技术只是解决问题的选择,而不是解决问题的根本...
* 我是Amor,为发骚而生!
*
*/
var multer = require('multer');
var md5 = require('md5');
var config = require('./config')
var storage = multer.diskStorage({
//设置上传文件路径,以后可以扩展成上传至七牛,文件服务器等等
//Note:如果你传递的是一个函数,你负责创建文件夹,如果你传递的是一个字符串,multer会自动创建
destination: config.upload.path,
//TODO:文件区分目录存放
//获取文件MD5,重命名,添加后缀,文件重复会直接覆盖
filename: function (req, file, cb) {
var fileFormat =(file.originalname).split(".");
cb(null, file.fieldname + '-' + md5(file) + "." + fileFormat[fileFormat.length - 1]);
}
});
//添加配置文件到muler对象。
var upload = multer({
storage: storage,
//其他设置请参考multer的limits
//limits:{}
});
//导出对象
module.exports = upload;
表单:
<form id='editfile' method='post' action='/system/upload' enctype='multipart/form-data'>
<input name="text" type="text"/>
选择图片:<input name="avatar" id='upfile' type='file'/>
<input type='submit' value='提交'/>
</form>
目前只是实现基本上传功能,还有许多待处理,比如错误处理、上传大小限制,图片压缩等等,如果需要,请自行扩展。
代码地址:https://github.com/amor520/nodejs-file-upload-multer 博客地址:http://www.amor.cool/nodejs-fileupload/ 转载请注明原地址,谢谢!
学习了谢谢楼主
@yatokami 我也是刚学习,还碰到了文件夹创建的坑,所以记录了 destination: config.upload.path, Note:如果你传递的是一个函数,你负责创建文件夹,如果你传递的是一个字符串,multer会自动创建
创建文件夹果断使用mkdirp~
@DevinXian 我一开始也用的mkdirp,然而碰到了同步异步的问题,因为callback
mk
学习了
@i5ting 大神终于来虐我了,哈哈,学习了 自豪地采用 CNodeJS ionic
@liygheart 嗯呢,我项目现在还不用,后续实现用于自己 自豪地采用 CNodeJS ionic
@i5ting 感谢大神分享,要知道有直接整合好七牛的,我博客里就不用扣nodeclub里的代码了。。
@amor520 异步就异步咯,解决方案还是很多的嘛- -
@i5ting 桑大把.vscode文件夹也搞上来了,哈哈,难不成是鼓励vscode咩
@DevinXian 我一直在用vscode啊,2016年的技术栈里推荐的也是vsc的
@DevinXian 是哒是哒
@liygheart 今日学习了
非常简单的一个文件上传例子:https://github.com/eshengsky/iBlog2/wiki/11-如何上传文件
@eshengsky 额,简单…? 自豪地采用 CNodeJS ionic
怎么样获取进度?
@yakczh 是的哦,multer还不能方便的获取文件进度,我这两天实现一下,会把代码补上,多谢提醒
if (!this.request.is('multipart/*')) return yield next
var parts = parse(this)
var part
while (part = yield parts) {
if (part.length) {
// arrays are busboy fields
console.log('key: ' + part[0])
console.log('value: ' + part[1])
} else {
console.log(" otherwise, it's a stream");
part.pipe(fs.createWriteStream(uploadfile))
}
}
每个请求来了,是不是所有的中间件都要过一遍,这样如果中间多了,会不会有性能问题?
@yakczh 那要看中间件处理的是什么逻辑了,基本的session,参数获取之类的,每个必须吧。特殊的可以指定条件加载(比如你写的例子就是multi/form-data
一类的才去处理上传);如果中间件是同步写数据的话,应该要考虑效率了;如果是纯内存操作,一般情况不至于有性能问题(流量大另一说了)。
@DevinXian session不一定是必须的,比如游客页面,一般网站的首页,搜索页,详情页根本不需要session处理 ,只有用户登录,设置项才需要开启session 我认为好的设计是按需载入,而不是一刀切的全加进来,这样业务简单的时候没问题,业务复杂,代码一多,立马就会遇到性能问题
@yakczh 说得对!
楼主,每次上传的文件都被被覆盖,不是同一个文件。生成的MD5是一样的
md5并不能保证图片唯一。只要文件同名,文件大小相似。计算出来的都是相同的md5
@axetroy 去看一下MD5的原理,或者作用,然后亲自试一下呢
@amor520 我说的是楼主的例子里面,md是调用 md5(file), 而file对象并不能保证唯一。(File 对象不是文件对象, 只是一个快照信息)
所以很容易就出现重复的md5.
你好我想问下 七牛哪个上传路径是怎么设置的呢?
你好,想问下怎么把文件储存在静态文件目录下面
@airzhanglin path: process.cwd() + ‘/uploads’ 这里指定目录
@amor520 发现在window环境下使用大神的方法没有问题,会在静态目录下面,但是在mac环境下一直上传到了根目录下了。
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '/tmp/my-uploads')
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now())
}
})
var upload = multer({ storage: storage })