使用节点js存在具有相同名称的文件时如何处理文件上载

时间:2016-06-27 12:16:23

标签: javascript node.js file-upload pug formidable

我正在使用formidable节点模块上传文件。 这是我的.jade代码

  form#uploadForm(enctype='multipart/form-data', method='POST', action='/upload')
    input#uploadTestSheet(type='file', name='uploadTestSheet', accept='.csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel')
    button(type='submit') Submit

文件正在上传,但如果目录中已存在文件,然后用户正在尝试添加具有相同名称的文件,则新文件不会上传。 这是我的服务器

var fs = require('node-fs-extra');
           var formidable = require('formidable');

    app.use(bodyparser({defer: true}));
    app.post('/upload',function (req, res, next) {

        var form = new formidable.IncomingForm();

        form.uploadDir =__dirname +"/uploads";
        form.keepExtensions = true;     
        form.parse(req, function(err, fields, files) {
              fs.rename(files.uploadTestSheet.path,__dirname +'/uploads'+files.uploadTestSheet.name, function(err) {
           if (err){
               res.render('ManualMode',{data:{id:req.user.id, hash:req.user.hash, nodePollInterval:req.user.nodePollInterval}});
               console.log("cannot upload: "+err);
           }  
           });
           res.render('index',{data:{id:req.user.id, hash:req.user.hash, nodePollInterval:req.user.nodePollInterval}});
       });

});

1 个答案:

答案 0 :(得分:1)

fs.rename方法遵循linux约定,因此它应该覆盖目录中的文件。这让我觉得你的问题可能在浏览器中。例如,Chrome,will refuse to upload files of the same name没有先清除输入字段中的value属性。在您的情况下,假设您的上传是异步的,这将是:

document.getElementById('uploadTestSheet').value = ''; // after each upload

如果您已经确认这不是问题,请尝试在重命名之前删除可能存在的文件,类似于:

...
var newFilename = __dirname + '/uploads' + files.uploadTestSheet.name
try {
  fs.unlinkSync(newFilename)
} catch (e) {
  if (e.code !== 'ENOENT')
    throw err; 
}

fs.rename(files.uploadTestSheet.path, newFilename, function(err) {
...

我希望有所帮助!