从Amazon S3构建文件树以存储在Firebase中



我希望能够从Amazon S3中检索键/值对,然后存储一些在Firebase中检索的信息,以便我可以在AngularJS中构建某种文件系统。<<<<<<<<<<<<<<<<<<<<<<<<<<<<

这个问题只能在firebase中存储。

现在,显然,您需要能够创建一个无限量的文件夹,并在这些文件夹中放置无限量的文件。

我的代码现在工作方式,如果要添加另一个子文件夹,则必须添加另一个If/else语句。我需要更动态的东西。

我有一个我在Angularjs中制作的脚本,可以从Amazon S3中检索键/值对,然后将其分解并根据返回的密钥将其存储在firebase中。

我将打破代码的位,以便我可以解释它,但是,我创建了一个带有整个块的JSFIDDLE:https://jsfiddle.net/lcr5p6qm/2/

首先,我使用服务从Amazon获得了键/值对。

storageService.getBucketDirectory({
   'bucket' : bucket,
   'directory' : 'code/'
}).then(function(code){

第二,我从firebase中删除上一个树,然后从s3中启动循环。

projectRef.child('code').remove();
angular.forEach(code, function(value, key){
   var item = value.Key.replace('code/', '');

第三,如果两人表示它是在基础上,我会这样存储。我们更改键以创建文件的类型和名称。

if(!item.includes('/'))
{
    var name = value.Key.replace('code/', '').replace('/', '').replace('+', ' ');
    if(name.indexOf('.') == 0)
    {
       var type = null;
    }
    else
    {
       var type = value.Key.substr(value.Key.indexOf('.') + 1)
    }
    projectRef.child('code').child('/').push({
       'Name'           : name,
       'Type'           : type,
       'Key'           : value.Key,
       'LastModified'  : value.LastModified,
       'Size'           : value.Size
    })
}

第四,如果两人不在基部,并且在钥匙中也有子文件夹,我们会更改钥匙,然后将其存储为此。如果没有子文件夹,我们只将其存储在文件夹中。

else {
  var folder = item.substr(0, item.indexOf('/'));
  if ((item.replace(folder + '/', '')).includes('/')) {
    var subfolder = item.replace(folder + '/', '');
    subfolder = subfolder.substr(0, subfolder.indexOf('/'));
    var name = value.Key.replace('code/', '').replace(folder + '/', '').replace(subfolder + '/', '').replace('+', ' ');
    if (name.indexOf('.') == 0) {
        var type = null;
    } else {
        var type = value.Key.substr(value.Key.lastIndexOf('.') + 1)
    }
    projectRef.child('code').child(folder).child(subfolder).push({
        'Name': name,
        'Type': type,
        'Key': value.Key,
        'LastModified': value.LastModified,
        'Size': value.Size
    })
  }
  else {
     var name = value.Key.replace('code/', '').replace(folder + '/', '').replace('+', ' ');
     if (name.indexOf('.') == 0) {
         var type = null;
     } else {
         var type = value.Key.substr(value.Key.indexOf('.') + 1)
     }
     projectRef.child('code').child(folder).push({
        'Name': name,
        'Type': type,
        'Key': value.Key,
        'LastModified': value.LastModified,
        'Size': value.Size
     })
   }
}

最后,这变成了下面的东西。

  • CSS
    • main.css
    • 归一化css
  • Doc
    • toc.md
    • css.md
    • 扩展。md
    • FAQ.MD
    • html.md
    • js.md
    • misc.md
    • usage.md
  • img
    • .gitignore
  • JS
    • main.js
    • plugins.js
    • 供应商
      • jquery-1.12.0.min.js
      • Modernizr-2.8.3.min.js

太好了,它有效,对吗?好吧,如果您不想要第二级目录,并且我们都知道这还不够。

我的问题是,如果我们在/js/vendor/文件夹中有另一个文件夹,它将破坏系统,名称和类型将包括子文件夹名称。

我需要一种方法来创建无限量的子文件夹并进行这项工作。

update

我提出了一些"清洁"代码,这些代码已在上面的链接中添加到我的JSFiddle中。这是"第二次尝试"的评论。这使我更接近我想要的东西,但没有进入子文件夹。

奖金:空文件夹呢?

firebase将接受类似路径的字符串作为.child()的参数,因此您只需要关注操作键字符串即可获取此路径和文件名。您可以做这样的事情:

var testKey = 'code/some/long/path/filename.txt';
var lastSlash = testKey.lastIndexOf('/');
var filepath = testKey.substring(0, lastSlash); // 'code/some/long/path'
var filename = testKey.substr(lastSlash+1);  // 'filename.txt'
projectRef.child(filepath).push({
    'Name': filename
});

最新更新