做起文件上传,就突然想起来访问权限问题。之前在apache服务器里,/var/www里面的文件是通过linux的权限管理来决定是否可以访问。那么express是怎么样的呢?

现在的访问权限

好像通过app.use(express.static(path.join(__dirname, 'public')));定义之后,直接访问 /some-url 就是在访问 public/文件夹下的文件。

使用Multer

安装:

$ npm install --save multer

header.ejs

<span><a title="发表" href="/post">post</a></span> 前添加一行代码:

<span><a title="上传" href="/upload">upload</a></span>

index.js

在 app.get('/logout') 函数后添加如下代码:

app.get('/upload', checkLogin);
app.get('/upload', function (req, res) {
  res.render('upload', {
    title: '文件上传',
    user: req.session.user,
    success: req.flash('success').toString(),
    error: req.flash('error').toString()
});
});

views/upload.ejs

<%- include header %>
<form method='post' action='/upload' enctype='multipart/form-data' >
  <input type="file" name='file'/><br>
  <input type="file" name='file'/><br>
  <input type="file" name='file'/><br>
  <input type="file" name='file'/><br>
  <input type="file" name='file'/><br>
  <input type="submit" />
</form>
<%- include footer %>

现在我们就可以访问文件上传页面了。 有一点和教程不同,我这5个name都是相同的,这样以备后面的设定。

routes/index.js

教程里把multer的设定放在了app.js。不过他使用的版本比较老旧,对于新版本的multer,那个代码已经失效了。我把所有的逻辑都转移到了routes里。

var multer = require('multer');

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
      cb(null, './public/uploads')
  },
  filename: function (req, file, cb) {
      cb(null, file.originalname)
  }
})

var upload = multer({ storage: storage });

...

app.get('/upload',checkLogin);
app.get('/upload',function(req,res){
    res.render('upload',
    {title: '文件上传',
    user: req.session.user,
    success: req.flash('success').toString(),
    error: req.flash('error').toString()
});
});


app.post('/upload', checkLogin);
app.post('/upload',upload.fields([{name:'file',maxCound:5}]), function (req, res) {
    req.flash('success', '文件上传成功!');
    res.redirect('/upload');
});

upload.fields([{name:'file',maxCound:5}]): req.files 里面的所有filedname都叫file,直接统一解决。 file.originalname: 保存的名字就是原来的文件名字。这个选项是必选的,否则上传的文件名都是随机乱码。

Muler API


感触

使用express.node.js的一个爽快之处就是整个框架的结构非常简洁,我可以从http请求处理到程序逻辑,几乎没有黑盒。 都很平面化,而且全部的插件都是通过 中间件 的形式出现。调用的逻辑也很统一: app.use

一切都尽在掌控的感觉。不用什么都去google一下,什么都在代码里。

太喜欢这种一切都按照逻辑来的感觉。 和人交往就不同,仿佛每个人都是一个随机数发生器。 想到一个梗,#define true (rand()>10) 差不多是这样。