クライアントがファイルを一度しかアップロードできないアップロードシステムを構築したいと思います。Firebaseストレージでmd5を使ってアップロードを制御する方法は?
- クライアントはファイルのmd5をサーバーに送信します。
- サーバーは、クライアントへのアップロードパスを返します。
- クライアントからファイルをストレージにアップロードします。
- 保存ルールは、クライアントの前に送信されたファイルのmd5をチェックします。
firebaseでこれを実装する方法は?
クライアントがファイルを一度しかアップロードできないアップロードシステムを構築したいと思います。Firebaseストレージでmd5を使ってアップロードを制御する方法は?
firebaseでこれを実装する方法は?
これは私がそれを行うような方法である:
私はFirebase Functions、StorageとDatabaseを使用します。
これを行うにはいくつかの方法がありますが、私は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にアップロードします。
私はこの質問二つの方法の解釈:
あなたは完全に保管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;
}
}
}
2番目の例では、Firebaseのmd5Hashがbase64でエンコードされているため、特殊文字のために動作しないようです。 – Thai
*ファイル*を識別何?つまり、このファイル*と*このファイル*の違いは何ですか? – Jay