2017-05-24 34 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

相关问题