当使用节点js存在同名文件时如何处理文件上传

How to handle file uploads when a file with same name exists using node js

我正在使用 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}});
       });

});

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) {
...

希望对您有所帮助!