我正在使用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}});
});
});
答案 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) {
...
我希望有所帮助!