从 Firebase Storage 获取多个图片下载 URL——我可以成功上传多个图片
Get multiple Image download URLs from Firebase Storage- I can successfully upload multiple images
我正在尝试一次将多张图片上传到 firebase 存储。我可以成功上传但无法检索下载 URLs;
Future<void> saveImages() async {
int index = images.length;
setState(() {
isLoading = true;
});
try {
final ref = FirebaseStorage.instance
.ref()
.child('images/${FirebaseAuth.instance.currentUser!.uid}');
images.forEach((element) async {
final file = await element.file;
final refPut = ref.child('$element$index');
await refPut.putFile(
File(file!.path),
);
});
final ref2 = ref.child('${imagePciker.path.split('/')}');
await ref2.putFile(File(imagePciker.path));
final ListResult listData = await ref.listAll();
final data =await ref2.getDownloadURL();
print('Im HERE!=Line 95');
Future.forEach(listData.items, (Reference element) async {
await element.getDownloadURL().then((value) => listUrls.add(value));
print('line 101');
print(listUrls.length);
});
print('Line 104');
await FirebaseFirestore.instance.collection('test').add({
'titleDownloadUrl': data,
'ListOfDownloadUrl': listUrls,
});
print('Line 108');
setState(() {
isLoading = false;
});
} catch (e) {
/* setState(() {
isLoading = false;
}); */
print(e);
}
}
打印语句用于调试。整个函数 returns 并没有抛出任何错误。
但是在 firebase 集合 'test' 中 URL 没有正确存储。
在first/fresh运行重启应用后
ListOfDownloadUrl 数组为空
热重启(没有图像保存在 firebase 存储中)
ListOfDownloadUrl 数组有一个 URL
然后在多次重启后,URL 秒的保存量变得巨大(即上传了 4 张图像 - 保存了 10 URL 秒)。
如果我需要添加任何其他内容,请评论;
感谢您的帮助
.forEach()
不是异步的——它不会等待。使用 await Promise.all(images.map())
(从而创建一个承诺数组,必须全部解决)。
已解决!
跟随@LeadDreamer的思路
forEach 不是异步的,他的回答的问题是 flutter 没有
Promise.all()
如果 Future.wait(),它的作用(在我的例子中)是一样的。
Future<void> saveImages() async {
int index = images.length;
setState(() {
isLoading = true;
});
try {
final refMain = FirebaseStorage.instance
.ref()
.child('images${FirebaseAuth.instance.currentUser!.uid}');
AssetEntity eleId =
new AssetEntity(id: '', typeInt: 5, width: 5, height: 5);
await Future.wait(images.map((element) async { <-- here instead of the for each
setState(() {
eleId = element;
});
final file = await element.file;
final refPut = refMain.child('suportImage$_counter/$element$index');
await refPut.putFile(
File(file!.path),
);
}));
final ref2 =
refMain.child('headingImage$_counter/${imagePciker.path.split('/')}');
await ref2.putFile(File(imagePciker.path));
final ListResult listData =
await refMain.child('suportImage$_counter').listAll();
final data = await ref2.getDownloadURL();
await Future.wait(listData.items.map((e) async { <-- here instead of for each
await e.getDownloadURL().then((value) => listUrls.add(value));
}));
我正在尝试一次将多张图片上传到 firebase 存储。我可以成功上传但无法检索下载 URLs;
Future<void> saveImages() async {
int index = images.length;
setState(() {
isLoading = true;
});
try {
final ref = FirebaseStorage.instance
.ref()
.child('images/${FirebaseAuth.instance.currentUser!.uid}');
images.forEach((element) async {
final file = await element.file;
final refPut = ref.child('$element$index');
await refPut.putFile(
File(file!.path),
);
});
final ref2 = ref.child('${imagePciker.path.split('/')}');
await ref2.putFile(File(imagePciker.path));
final ListResult listData = await ref.listAll();
final data =await ref2.getDownloadURL();
print('Im HERE!=Line 95');
Future.forEach(listData.items, (Reference element) async {
await element.getDownloadURL().then((value) => listUrls.add(value));
print('line 101');
print(listUrls.length);
});
print('Line 104');
await FirebaseFirestore.instance.collection('test').add({
'titleDownloadUrl': data,
'ListOfDownloadUrl': listUrls,
});
print('Line 108');
setState(() {
isLoading = false;
});
} catch (e) {
/* setState(() {
isLoading = false;
}); */
print(e);
}
}
打印语句用于调试。整个函数 returns 并没有抛出任何错误。 但是在 firebase 集合 'test' 中 URL 没有正确存储。
在first/fresh运行重启应用后 ListOfDownloadUrl 数组为空
热重启(没有图像保存在 firebase 存储中) ListOfDownloadUrl 数组有一个 URL
然后在多次重启后,URL 秒的保存量变得巨大(即上传了 4 张图像 - 保存了 10 URL 秒)。
如果我需要添加任何其他内容,请评论; 感谢您的帮助
.forEach()
不是异步的——它不会等待。使用 await Promise.all(images.map())
(从而创建一个承诺数组,必须全部解决)。
已解决!
跟随@LeadDreamer的思路
forEach 不是异步的,他的回答的问题是 flutter 没有
Promise.all()
如果 Future.wait(),它的作用(在我的例子中)是一样的。
Future<void> saveImages() async {
int index = images.length;
setState(() {
isLoading = true;
});
try {
final refMain = FirebaseStorage.instance
.ref()
.child('images${FirebaseAuth.instance.currentUser!.uid}');
AssetEntity eleId =
new AssetEntity(id: '', typeInt: 5, width: 5, height: 5);
await Future.wait(images.map((element) async { <-- here instead of the for each
setState(() {
eleId = element;
});
final file = await element.file;
final refPut = refMain.child('suportImage$_counter/$element$index');
await refPut.putFile(
File(file!.path),
);
}));
final ref2 =
refMain.child('headingImage$_counter/${imagePciker.path.split('/')}');
await ref2.putFile(File(imagePciker.path));
final ListResult listData =
await refMain.child('suportImage$_counter').listAll();
final data = await ref2.getDownloadURL();
await Future.wait(listData.items.map((e) async { <-- here instead of for each
await e.getDownloadURL().then((value) => listUrls.add(value));
}));