簡體   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