问题描述
我正在将Firebase Storage用于我的客户端应用程序,以将视频上传到Cloud Storage。
在上载时,我使用storageRef.getDownloadURL()
从客户端生成了一个下载链接,并将其添加到Firestore文档中。视频上传后,将触发云功能来处理视频。之后将其覆盖到Cloud Storage。到那时,我认为先前版本的访问令牌已被撤消,如果我尝试通过我保存在Firestore中的链接加载视频,则无法正确加载。我考虑的两个解决方案是1.从Cloud Functions中的admin API中以某种方式生成新链接并更新db,或者2.使用某些标志/选项覆盖gcs对象而不丢失其凭证。但是我不确定如何做这两个。
final StorageReference storageRef = FirebaseStorage.instance
.ref()
.child('/challenge_proofs/${topic['id']}/${user.uid}/$fileId');
final StorageUploadTask uploadTask = storageRef.putFile(_video);
await uploadTask.onComplete;
print('Upload Status:');
print(uploadTask.isSuccessful);
storageRef.getDownloadURL().then((dynamic fileURL) async {
print('Add fileURL to db here');
});
这是我将视频文件从Cloud Functions覆盖到存储(TypeScript) 的方法:
// Inside triggered Cloud Function
const remoteFilename = `challenge_proofs/${proofData['challengeId']}/${proofData['ownerId']}/${proofData['mediaId']}`;
const generatedOutput = join(tmpdir,"videogen.mp4");
let downloadDest = '';
await bucket.file(remoteFilename).download({ destination: downloadDest });
// DOING FILE PROCESSING //
await bucket.upload(generatedOutput,{ destination: remoteFilename,resumable: false });
这是我的Firebase存储规则:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read,write: if false;
}
match /challenge_proofs/{challengeId}/{userId}/{allPaths=**} {
allow read,write: if request.auth != null && request.auth.uid == userId;
}
}
}
我注意到,在Firebase控制台中,客户端上传后有一个对象“访问令牌”,而在覆盖后消失了。
用户赞扬之后: 管理员(云功能)上传后:(无“访问令牌”)解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)