1

我有一个 express.js应用程序,并且我正在使用石膏板来管理用户系统。

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

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

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

提前感谢那些提供帮助的人。

4

1 回答 1

1

因此,首先您应该使用以下命令为每个用户创建一个文件夹fs.mkdir

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

假设您想将这些文件夹创建到您的应用程序根目录/图像中:

例子:

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仅用于上传 url 的中间件(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)。

于 2013-11-15T08:26:57.977 回答