我正在尝试在sails.js中创建一个文件上传器,我已经关注了文档并使用了saveAs函数:
create: function(req, res){
var filename = req.file('file')._files[0].stream.filename;
var file = req.file('file');
file.upload({dirname: '../../assets/uploads/', saveAs: function (__newFileStream,cb) { cb(null, filename); }}, function(err, uploadedFiles){
if(err){
return res.json(err);
}
Archivo.create({nombre: uploadedFiles[0].filename, url: '/uploads/' + uploadedFiles[0].filename}).exec(function(err, uploadedFile){
if(err){
return res.json(err);
}
return res.json(uploadedFile);
});
});
},
create controller将带有文件名的文件上传到assets文件夹,然后创建Archivo记录
我的问题是我不想覆盖文件,如果我再次上传它,例如,如果我上传一个名为image.jpg的文件,我再次上传它我想第二次将它重命名为图像(1) .JPG
有人知道怎么做吗?
答案 0 :(得分:1)
以下相同使用时,将根据上传的文件名为您提供与您上传文件相匹配的文件数。它将使用正则表达式来匹配基于此模板图像(1).jpg。
因此,如果您上传image.jpg,它会在您的目录中查找并查找匹配的所有文件,以下所有内容都将匹配。
image.jpg
image(1).jpg
image(2).jpg
image(3).jpg
image(4).jpg
因此,系统将返回这些文件,通知您有5个匹配项。因此,您现在可以使用该数字重命名您在图像(5).jpg上传的文件。
这应该让你开始。它使用NPM fs-finder库。
var Finder = require('fs-finder');,
filename = req.file('file')._files[0].stream.filename,
directory = '../../assets/uploads/',
filePreFix = filename.split('.')[0].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'),
fileExtension = filename.split('.')[1].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')),
var NumberOfMatchingFiles =
Finder
.in(direcotry)
.findFiles(
filePreFix +
'(\([0-9]*\))*\' +
fileExtension
).length
就像我说的,这只会让你开始。您可以拥有并发布删除image(2).jpg的位置,因此您将只有4个文件并尝试将新上传的文件命名为image(4).jpg将覆盖文件。您可以根据fs-finder返回的文件列表进行检查。