如何防止 sailsjs 文件上传覆盖
how to prevent the sailsjs file upload override
我正在尝试在 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
有人知道怎么做吗?
以下结合使用时,将根据上传的文件名为您提供与您上传的文件相匹配的文件数。它将使用正则表达式根据此模板进行匹配 image(1).jpg.
因此,如果您上传 image.jpg,它会在您的目录中查找所有匹配的文件,以下所有文件都会匹配。
image.jpg
image(1).jpg
image(2).jpg
image(3).jpg
image(4).jpg
因此系统将 return 那些文件让您知道您有 5 个匹配项。因此,您现在可以使用该编号重命名您在 image(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 return 编辑的文件列表进行检查。
我正在尝试在 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
有人知道怎么做吗?
以下结合使用时,将根据上传的文件名为您提供与您上传的文件相匹配的文件数。它将使用正则表达式根据此模板进行匹配 image(1).jpg.
因此,如果您上传 image.jpg,它会在您的目录中查找所有匹配的文件,以下所有文件都会匹配。
image.jpg
image(1).jpg
image(2).jpg
image(3).jpg
image(4).jpg
因此系统将 return 那些文件让您知道您有 5 个匹配项。因此,您现在可以使用该编号重命名您在 image(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 return 编辑的文件列表进行检查。