我想建立客戶端只能上傳一次文件的上傳系統。如何使用Firebase存儲中的md5控制上傳?
- 客戶端將文件的md5發送到服務器。
- 服務器將上傳路徑返回給客戶端。
- 客戶端上傳文件到存儲。
- 存儲規則檢查文件的md5是否在客戶端發送之前。
如何在firebase中實現這個?
我想建立客戶端只能上傳一次文件的上傳系統。如何使用Firebase存儲中的md5控制上傳?
如何在firebase中實現這個?
這是我會做的方式:
我會用火力地堡Functions,Storage和Database。
有幾種方法可以做到這一點,我的可能不是簡單的,但它應該讓你去。
在客戶端獲取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存儲中,並使用函數提供的路徑。
我解釋這個問題的方法有兩種:
您可以完全在存儲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;
}
}
}
在第二個示例中,Firebase中的md5Hash是base64編碼的,因此似乎由於特殊字符而無法工作? – Thai
什麼標識*文件*?即*這個文件*和*這個文件*之間有什麼區別? – Jay