代码:
app.post('/upload',photos.submit(app.get('photos'))) //为什么处理路由的方法还要传入一个 (app.get('photos')) 这是为什么呢 为什么会这样呢??
exports.submit = function (dir) { // 所谓dir 是什么呢?
return function (req, res, next) {
var img = req.files.photo.image; // 这里是文件
var name = req.body.photo.name || img.name; // 这里是一个input 输入图片名字
var path = join(dir,img.name)
fs.rename(img.path,path, function (err) {
if(err) return next(err) // 为什么要调用rename方法呢?
Photo.create({ // 这里是一个mongoose 实例
name:name,
path:img.name
}, function (err) {
if(err) return next(err)
res.redirect('/')
})
})
}
}
app.get('photos')
是获取以前用app.set('photos',值)
设置的值。所以说代码的前半部分应该有设置这个值的代码,这个值的意思就是保存上传文件的路径。后面这个返回一个处理函数跟直接写
function (req,res,next){}
的区别就是,多了一个闭包保存app.get
获取的路径。上传文件,express3.0里面是,框架先给你保存到一个临时的位置,然后自己用代码移动到你自己想要保存的位置。
req.files
里面存储了上传文件的信息(大小,名字,临时保存位置等)。fs.rename
:其实你没有发现,rename
和file.move
其实是同一个意思,都是移动文件的意思。所以结论就是:
dir
定义你想保存上传图片的路径。rename
移动文件到你想保存的位置(顺便如果用户可以取自定义的名字)最好贴个前端form的代码。