2017-05-24 1 views
0

クライアントがファイルを一度しかアップロードできないアップロードシステムを構築したいと思います。Firebaseストレージでmd5を使ってアップロードを制御する方法は?

  1. クライアントはファイルのmd5をサーバーに送信します。
  2. サーバーは、クライアントへのアップロードパスを返します。
  3. クライアントからファイルをストレージにアップロードします。
  4. 保存ルールは、クライアントの前に送信されたファイルのmd5をチェックします。

firebaseでこれを実装する方法は?

+0

*ファイル*を識別何?つまり、このファイル*と*このファイル*の違いは何ですか? – Jay

答えて

0

これは私がそれを行うような方法である:

私はFirebase FunctionsStorageDatabaseを使用します。

これを行うにはいくつかの方法がありますが、私はeasietではないかもしれませんが、それはあなたに行くべきです。

クライアントでMD5ハッシュを取得します。

/requests/{md5Hash}

あなたの機能は、そのエンドポイントのonWrite()イベントリスナーを持っているようなものに自分のデータベースにMD5ハッシュを書きます。

この関数は、/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 Storageにアップロードします。

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

2番目の例では、Firebaseのmd5Hashがbase64でエンコードされているため、特殊文字のために動作しないようです。 – Thai

関連する問題