2016-09-06 71 views
2

我为我的后端API使用Strongloop loopback。 我正在使用它的loopback-component-storage来上传和管理文件。更具体地说,我正在使用文件系统,但在生产时会切换到AWS存储。Loopback:如何将文件从一个容器复制到另一个容器?

平台上的用户可以复制一个项目,为此也将复制已上传的链接文件。

我的问题是,如何从一个容器复制到另一个文件?

这里是我到目前为止的代码来创建一个新的容器:

Project.app.models.storage.getContainer(templateId, function (err, container) { 
    if(err){ 
     // If error, no docs have been added or created, so just skip       
     return; 
    } 
    Project.app.models.storage.createContainer({ name: projectId},function (err,container) { 
    if(err){ 
     console.log("Error creating a container when copying project"); 
     return; 
    } 
    // Here is where I need assistance 
    }); 
}); 

回答

2

它可以创建下载流然后通过管道它从一个容器到另一个上载流,但不会是一个好主意因为你会创建不必要的流量。让你的底层环境为你做好工作。

在您的本地开发环境,可以使用FS模块处理文件,但是当您迁移存储至S3你应该使用AWS SDK复制文件。您可以在您的存储模型上创建远程方法,它将采用源存储桶/文件夹和目标存储桶/文件夹为您复制文件。

喜欢的东西:

Storage.remoteMethod(
    'copyS3File', 
    { 
     accepts: [ 
     {arg: 'copySource', type: 'string'}, 
     {arg: 'destinationBucket', type: 'string'}, 
     {arg: 'destinationFileName', type: 'string'}], 
     returns: {arg: 'success', type: 'string'} 
    } 
); 

    Storage.copyS3File = function(copySource, destinationBucket, destinationFileName, cb) { 
    var AWS = require('aws-sdk'); 
    var s3 = new AWS.S3({params: {Bucket: 'yourbucket',region:'yourregion'}}); 
    var params = {CopySource: copySource, Bucket: destinationBucket, Key: destinationFileName}; 
    s3.copyObject(params, function(err, success) { 
     if (err) cb(err); // an error occurred 
     else  cb(null, success)   // successful response 
    }); 
    }); 

Calling the copyObject operation的S3。

请注意,此代码是不是测试或准备投产。这里只是给你一个想法如何去做。

还要注意的是S3比loopbackjs实现存储的有所不同。 S3具有扁平结构,但使用键名称前缀支持文件夹中的文件组织。

Working with S3 folders

为了让事情变得更加清晰,可以通过该列表从源容器和循环获取文件列表复制使用像上面这样创建的远程方法文件到新的目标:

Storage.getFiles({container: 'yourContainer'}, function(files){ 

    files.forEach(function(file){ 
    Storage.copyS3File(file.container + '/' + file.name, 'newContainer', 'newFile.name', cb); 
    }); 

}, function(err){ 
    console.log(err); 
}); 
1

的主意为文件系统提供程序执行此操作

  1. 从要从中复制文件的容器中获取文件列表,使用storage.GetFiles('container-name ',回调)
  2. 创建您要使用存储复制这些文件的容器。 createContainer()
  3. 获取流使用storage.uploadStream上传(“recently-创建容器”,“文件名”)
  4. 获取读取流文件和管道的读取和写入操作
  5. 重复步骤3和4的每个文件(或者你可以链中的数据流,如果你想)

在你的情况的代码看起来像

Project.app.models.storage.getContainer(templateId, function (err, container) { 
    if(err || !container){ 
     // If error, no docs have been added or created, so just skip 
     return; 
    } 
    Project.app.models.storage.getFiles(templateId, function (err, files) { 
     if(err){ 
      // If error, no docs have been added or created, so just skip 
      return; 
     } 
     Project.app.models.storage.createContainer({ name: projectId},function (err,newcontainer) { 
     if(err || !newcontainer){ 
      console.log("Error creating a container when copying project"); 
      return; 
     } 
     files.forEach(function(file){ 
      var writer = container.uploadStream(newcontainer.name, file.name); 
      require('fs').createReadStream('path-to-storage-directory/'+container.name+'/'+file.name).pipe(writer); 
      writer.on('finish', function(err,done){ 
       console.log('finished writing file'+file.name) 
      }); 
      writer.on('error', function(err){ 
       console.log('error in copying file'+file.name,err) 
      }); 
     }); 
     }); 
    }) 
}) 
相关问题