1

我正在尝试在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 控制器将带有文件名的文件上传到 assets 文件夹,然后创建 Archivo 记录

我的问题是,如果我再次上传文件,我不想覆盖该文件,例如,如果我上传一个名为 image.jpg 的文件,然后我再次上传它,我希望第二次将其重命名为 image(1).jpg

有人知道怎么做吗?

4

1 回答 1

1

以下结合使用时,将根据上传的文件名为您提供与您上传的文件匹配的文件数量。它将基于此模板 image(1).jpg 使用正则表达式进行匹配。

因此,如果您上传 image.jpg,它将在您的目录中查找所有匹配的文件,以下所有文件都将匹配。

image.jpg
image(1).jpg
image(2).jpg
image(3).jpg
image(4).jpg

因此系统将返回这些文件,让您知道您有 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 返回的文件列表进行检查。

于 2015-05-12T12:48:34.410 回答