我想建立客户端只能上传一次文件的上传系统。如何使用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