2017-05-24 35 views
0

我想建立客戶端只能上傳一次文件的上傳系統。如何使用Firebase存儲中的md5控制上傳?

  1. 客戶端將文件的md5發送到服務器。
  2. 服務器將上傳路徑返回給客戶端。
  3. 客戶端上傳文件到存儲。
  4. 存儲規則檢查文件的md5是否在客戶端發送之前。

如何在firebase中實現這個?

+0

什麼標識*文件*?即*這個文件*和*這個文件*之間有什麼區別? – Jay

回答

0

這是我會做的方式:

我會用火力地堡FunctionsStorageDatabase

有幾種方法可以做到這一點,我的可能不是簡單的,但它應該讓你去。

在客戶端獲取MD5哈希值。

寫MD5哈希到數據庫到像/requests/{md5Hash}

你的函數有該端點的onWrite()事件偵聽器。

該函數在端點/files/{md5Hash}等端點中查找完全鎖定(無法讀寫外部世界)的另一個端點中的md5Hash。

雲功能:

(下面是寫在「自由之手」,所以可能會有一些錯誤,但你的想法)

module.exports = functions.database.ref('requests/{userId}/{md5Hash}') 
.onWrite(event => { 
    //Only respond to new writes 
    if (!event.data.val() || event.data.previous.val()) { 
    return null 
    } 
    const {userId, md5Hash} = event.params; 

    ref.child('files').child(userId).once('value') 
    .then(snapshot => { 
     return snapshot.hasChild(md5Hash) 
    }) 
    .then(exists => { 
    //If the md5Hash doesn't already exist 
    var obj = {}; 
    if (!exists) { 
     obj['status'] = 'permitted' 
     //This will be the path for Storage 
     obj['path'] = `files/${userId}/${md5Hash}` 
    } else { 
     obj['status'] = 'denied' 
    } 
    return event.data.ref.update(status) 
    }) 
    .catch(error => { 
    console.log(error); 
    }) 

}) 

雖然這對你可能讓會您的客戶端會收聽您的/request/{md5Hash}端點。在此端點中,您可以有一個狀態鍵來表示操作的狀態。如果雲功能檢測MD5哈希已經存在,它會寫/requests/{md5Hash}/status = denied,如果它不將寫/requests/{md5Hash}/status = permitted。\

然後,您可以在您的雲功能,將包括不同爲您的文件的路徑參數,例如const path = ${userId}/${files}/${md5Hash}

然後將該路徑寫入/requests/{md5Hash}/path = yourPath

然後將您的對象上傳到Firebase存儲中,並使用函數提供的路徑。

0

我解釋這個問題的方法有兩種:

  • 不要允許一個文件被覆蓋
  • 不允許被寫入兩次相同的文件(使存儲空間最小)

您可以完全在存儲security rules

// Don't allow overwrites 
service firebase.storage { 
    match /b/{bucket}/o { 
    match /files/{fileName} { 
     // Allow an initial upload, or a metadata change 
     allow write: if resource == null 
        || request.resource.md5Hash == resource.md5Hash; 
    } 
    } 
} 

// Hash files so you only have one file 
service firebase.storage { 
    match /b/{bucket}/o { 
    match /files/{fileHash} { 
     // Allow initial upload only, ensure that the hashes match 
     allow write: if resource == null 
        && request.resource.md5Hash == fileHash; 
    } 
    } 
} 
+0

在第二個示例中,Firebase中的md5Hash是base64編碼的,因此似乎由於特殊字符而無法工作? – Thai

相關問題