【问题标题】:Building a File Tree from Amazon S3 to be stored in Firebase从 Amazon S3 构建文件树以存储在 Firebase 中
【发布时间】:2016-12-12 23:43:55
【问题描述】:

我希望能够从 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
  • 文档
    • 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/ 文件夹内有另一个文件夹,它会破坏系统并且名称和类型将包含子文件夹名称。

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

更新

我想出了一些“更干净”的代码,这些代码已添加到上面链接中的我的 JSFiddle 中。它在评论“第二次尝试”下。这让我更接近我想要的,但没有让子文件夹进入。

奖励:空文件夹呢?

【问题讨论】:

  • 您可以分享服务返回的code 值吗?
  • 这只是一个虚拟的 html5 样板。所以,是的,小提琴会是最好的吗?我应该先添加另一个子文件夹来显示我的问题吗?
  • 不...我想看看getBucketDirectory 中的return 值是否有助于您循环......code
  • 这就是我的意思,我会安慰它并展示它。
  • 是的..那会很有帮助

标签: javascript angularjs amazon-web-services firebase amazon-s3


【解决方案1】:

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

【讨论】:

  • 我知道这不是问题,但是,您介意向我展示一下,一旦从 Firebase 存储和检索到这些数据,您将如何构建一个 UL 列表吗?您如何考虑路径的未知深度?
  • 我提出了一个新问题,也许你有一个想法。没有得到其他人的帮助。 stackoverflow.com/questions/41112356/…
猜你喜欢
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2017-06-14
  • 1970-01-01
  • 2021-12-02
相关资源
最近更新 更多