Flutter中如何获取Firebase Storage文件URL并存入Firestore?
解决Firebase Storage上传后获取下载URL并存入Firestore的问题
你当前的问题是上传音频到Storage后,没有获取到云端的下载URL,直接把本地文件路径_filePath存入了Firestore。要解决这个问题,需要在文件上传完成后调用Firebase Storage的getDownloadURL()方法获取公开访问链接,再将该链接存入Firestore。
修改后的完整代码:
// Firebase Storage 上传方法 Future<void> _onFileUploadButtonPressed() async { FirebaseStorage firebaseStorage = FirebaseStorage.instance; setState(() { _isUploading = true; }); try { // 先获取存储引用 final storageRef = firebaseStorage .ref() .child("${loggedInUser.uid}/records1") .child( _filePath.substring(_filePath.lastIndexOf('/'), _filePath.length)); // 上传文件 await storageRef.putFile(File(_filePath)); // 获取云端下载URL final downloadUrl = await storageRef.getDownloadURL(); widget.onUploadComplete(); // 将获取到的URL传给onsend方法 onsend(downloadUrl); } catch (error) { print('上传Firebase出错 ${error.toString()}'); ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('上传过程中出现错误'), ), ); } finally { setState(() { _isUploading = false; }); } } // Firestore 存储URL方法 Future<void> onsend(String downloadUrl) async { FirebaseFirestore firebaseFirestore = FirebaseFirestore.instance; await firebaseFirestore .collection("users") .doc("${loggedInUser.uid}") .collection("reco") .add({'downloadURL': downloadUrl}).whenComplete(() => showSnackBar("音频上传成功", const Duration(seconds: 2))); }
关键修改点说明:
- 存储引用复用:先创建
storageRef变量,避免重复构建存储路径,后续上传和获取URL都使用同一个引用。 - 获取下载URL:文件上传完成后,调用
storageRef.getDownloadURL()获取云端的公开访问链接,这个链接才是其他设备可以访问音频的有效地址。 - 传递URL到Firestore方法:修改
onsend方法,接收获取到的downloadUrl参数,替换原来的本地路径_filePath存入Firestore。
注意:确保你的Firebase Storage规则允许公开读取(或根据业务需求配置合适的权限),否则获取到的URL可能无法正常访问。
内容的提问来源于stack exchange,提问作者Dasun Dola
相关产品推荐
相关产品推荐

