当使用节点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) {
...
希望对您有所帮助!
我正在使用 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) {
...
希望对您有所帮助!