簡體   English   中英

如何將上傳的圖像列表上傳到 flutter 上的 Firestore?

[英]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。

您需要區分兩種類型的寫入:

  1. 普通數據的初始寫入,可以是一個集合。
  2. 每個下載 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM