因此,首先您应该使用以下命令为每个用户创建一个文件夹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)。