express.js每个用户的唯一目录

时间:2013-11-15 00:23:07

标签: javascript node.js file upload express

我有一个express.js app,我正在使用干墙来管理用户系统。

当用户注册时,我希望为该用户生成一个目录,我希望该用户能够将文件上传到该目录并通过他或她的帐户查看这些文件。

我不完全确定,但我认为最有可能的目录生成我必须在views / signup / index.js中进行,并且用户只能在登录时将文件上传到他或她的目录。

但是,在保存和显示文件方面,我有点卡住了。我对服务器端代码的经验很少,因此实现诸如访问文件之类的操作稍微超出了我的范围。

提前感谢那些帮助的人。

1 个答案:

答案 0 :(得分:1)

首先,您应该使用fs.mkdir

为每个用户创建一个文件夹

http://nodejs.org/api/fs.html#fs_fs_mkdir_path_mode_callback

假设您要在应用程序根/ images中创建这些文件夹:

示例:

var fs = require('fs');
fs.mkdir(__dirname + '/images/' + userId, function(err) {
  if (err) {
    /* log err etc */
  } else { 
    /* folder creation succeeded */
  }
});

您应该使用userId作为文件夹名称(因为它比尝试从用户名本身中删除不良字符更容易,如果用户更改其用户名,这也将在以后使用)。

您需要做的第二件事是允许用户上传文件(但只有在他登录并进入正确的文件夹时)。最好不要为所有路由添加bodyParser中间件,而是包括json&&所有路由的urlencoded中间件(http://www.senchalabs.org/connect/json.html& http://www.senchalabs.org/connect/urlencoded.html)和multipart中间件仅用于上传网址(http://www.senchalabs.org/connect/multipart.html&&示例: https://github.com/visionmedia/express/blob/master/examples/multipart/index.js)。

一个例子:

app.post('/images', express.multipart({ uploadDir: '/tmp/uploads' }), function(req, res, next) {
  // at this point the file has been saved to the tmp path and we need to move
  // it to the user's folder
  fs.rename(req.files.image.path, __dirname + '/images/' + req.userId + '/' + req.files.image.name, function(err) {
    if (err) return next(err);

    res.send('Upload successful');
  });
});

注意:在上面的示例中,我考虑到req.userId由auth中间件填充了用户的ID。

如果用户有权查看图像,则向用户显示图像(auth中间件也应该应用于此路径):

app.get('/images/:user/:file', function(req, res, next) {
  var filePath = __dirname + '/images/' + req.userId + '/' + req.params.file;

  fs.exists(filePath, function(exists) {
    if (!exists) { return res.status(404).send('Not Found'); }

    // didn't attach 'error' handler here, but you should do that with streams always
    fs.createReadStream(filePath).pipe(res);
  });
});

注意:在生产中你可能想要使用send,那个例子只是演示流程(https://github.com/visionmedia/send)。