[英]How can i upload list of uploaded images into Firestore on flutter?
我將多張圖像上傳到 FirebaseStorage,然后將 URL 圖像保存到 Firestore,但只有一張 URL 圖像保存到 Firestore。
for (var img in _image) {
Reference firebaseStorage = FirebaseStorage.instance
.ref()
.child("images/${foldername}/${imagename}");
UploadTask uploadTask = firebaseStorage.putFile(img);
TaskSnapshot task = await uploadTask;
task.ref.getDownloadURL().then((value) {
FirebaseFirestore.instance.collection("items").doc(user.uid).set({
"item_name": item_name.text,
"item_description": item_description.text,
"item_price": item_price.text,
"typeofitem": currentvalueSelected,
"sizeofitem": FieldValue.arrayUnion([selectedsize]),
"images": FieldValue.arrayUnion([value])
});
});
}
現在,當圖像的上傳完成並且您已下載 URL 時,您每次調用FirebaseFirestore.instance.collection("items").doc(user.uid).set({...})
。 像這樣調用set()
會替換文檔的現有內容,因此您最終會得到公共字段,然后只下載要完成的最后一個圖像的 URL。
您需要區分兩種類型的寫入:
var docRef = FirebaseFirestore.instance.collection("items").doc(user.uid);
docRef.set({
"item_name": item_name.text,
"item_description": item_description.text,
"item_price": item_price.text,
"typeofitem": currentvalueSelected,
"sizeofitem": FieldValue.arrayUnion([selectedsize]),
});
for (var img in _image) {
Reference firebaseStorage = FirebaseStorage.instance
.ref()
.child("images/${foldername}/${imagename}");
UploadTask uploadTask = firebaseStorage.putFile(img);
TaskSnapshot task = await uploadTask;
task.ref.getDownloadURL().then((value) {
docRef.update({
"images": FieldValue.arrayUnion([value])
});
});
}
這是因為您已調用在 for 循環中設置文檔,因此每次迭代后先前的數據都會被覆蓋
如果您上傳大量圖片,您可以使用Future.wait
。
...
List<UploadTask> uploadImgToStorageFutures = [];
List<Future<String>> getImgUrlFutures = [];
for (var img in _image) {
Reference firebaseStorage = FirebaseStorage.instance
.ref()
.child("images/${foldername}/${imagename}");
UploadTask uploadTask = firebaseStorage.putFile(img);
uploadImgToStorageFutures.add(uploadTask);
}
await Future.wait(uploadImgToStorageFutures).then((tasks) => tasks.forEach((task) {
getImgUrlFutures.add(task.ref.getDownloadURL());
}));
await Future.wait(getImgUrlFutures).then((urls) =>
FirebaseFirestore.instance.collection("items").doc(user.uid).set({
"item_name": item_name.text,
"item_description": item_description.text,
"item_price": item_price.text,
"typeofitem": currentvalueSelected,
"sizeofitem": FieldValue.arrayUnion([selectedsize]),
"images": urls
}));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.