2015-05-11 55 views
1

我试图使sails.js文件上传,我按照文档和使用另存为功能,因为这:如何防止sailsjs文件上传覆盖

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); 
     }); 

    }); 
}, 

的创建控制器上传文件的文件名到资产文件夹,然后创建一个Archivo记录

我的问题是,我不想重写文件,如果我再次上传,例如,如果我上传一个名为image.jpg的文件,我再次上传我想第二次将它重命名为图像(1).jpg

有人知道如何做到这一点?

回答

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 

就像我说的,这会让你开始。你可以在你删除图像(2).jpg的地方发出问题,因此你将只有4个文件,并试图为你新上传的文件命名,因为image(4).jpg会覆盖文件。您可以检查fs-finder返回的文件列表。

+0

谢谢,我已经使用fs-finder,唯一的是我不得不修改上传文件名以匹配filePreFix,因为如果您上传名称中包含空格的文件,此代码会将其作为不同的名称 –