繁体   English   中英

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

[英]Building a File Tree from Amazon S3 to be stored in Firebase

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

这个问题只涉及到Firebase中的存储。

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

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

我有一个用AngularJS编写的脚本,该脚本从Amazon S3检索键/值对,然后将其分解并根据返回的键将它们存储在Firebase中。

我将把代码分解一下,以便我可以解释一下,但是我创建了一个jsFiddle,其中包含了整个块: https ://jsfiddle.net/Lcr5p6qm/2/

首先,我使用服务从亚马逊获取键/值对。

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
    • normalize.css
  • doc
    • 目录
    • css.md
    • 扩展
    • 常见问题
    • html.md
    • js.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中。 它位于注释“ Second Attempt”下。 这使我更接近想要的东西,但没有进入子文件夹。

奖励:空文件夹呢?

Firebase将接受类似路径的字符串作为.child()的参数,因此您只需要关心操作Key字符串以获取此路径和文件名即可。 您可以执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM