file upload:创build目录,如果不存在

我用强大的处理在NodeJS上的file upload。 这对我有用。 现在我想要更多地构build上传。 我从上传angular度传递一个字段,这是一个project_id 。 我想在我的上传中创build一个文件夹,用这个ID命名并写入文件。

所以我检查目录是否存在,如果没有,我使用fs.mkdir创build它,然后将文件写入它。 试试这个,我得到一个EINVAL, rename错误和一个HTTP 500状态码。

这是我的尝试,有人有一个想法如何解决这个问题?

  app.post('/uploads/', function(req, res, next){ var form = new formidable.IncomingForm(); form.keepExtensions = true; form.parse(req, function(err, fields, files){ if (err) next (err); fs.exists('uploads/' + fields.project_id + '/', function (exists){ if (exists) { fs.rename(files.upload.path, 'uploads/' + fields.project_id + '/' +files.upload.name, function(err){ if (err) next (err); res.render('profile.ejs',{ user: req.user }); }); } else { fs.mkdir('uploads/' + fields.project_id + '/', function (err){ if (err) next (err); }); fs.rename(files.upload.path, 'uploads/' + fields.project_id + '/' + files.upload.name, function(err){ if(err) next (err); res.render('profile.ejs',{ user:req.user }); }); } }); }); }); 

您正试图在创build目录之前重命名该文件。 另外,使用fs.exists是不可取的,这个函数在将来会被弃用。

我在代码中进行了一些更改,可以使用path模块来创buildpath。 另外,请尝试创build目录,而不pipe它是否已经存在。 如果存在,则忽略错误代码EEXIST。

更新的代码:

 // add this to the beggining var path = require('path'); app.post('/uploads', function(req, res, next){ var form = new formidable.IncomingForm(); form.keepExtensions = true; form.parse(req, function(err, fields, files){ if (err) next (err); fs.mkdir(path.resolve('uploads', fields.project_id), function (err) { if (err && err !== 'EEXIST') { next(err); } else { fs.rename(files.upload.path, path.resolve('uploads', fields.project_id, files.upload.name), function(err){ if(err) next (err); res.render('profile.ejs',{ user:req.user }); }); } }); }); });