【问题标题】:How can i upload list of uploaded images into Firestore on flutter?如何在颤动时将上传的图像列表上传到 Firestore?
【发布时间】:2023-03-11 14:23:01
【问题描述】:

我将多张图片上传到 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])
      });
    });
  }

【问题讨论】:

    标签: flutter google-cloud-firestore firebase-storage


    【解决方案1】:

    这是因为你在 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
        }));
    

    【讨论】:

      【解决方案2】:

      现在,当图像上传完成并获得其下载 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])
            });
          });
        }
      

      【讨论】:

        猜你喜欢
        • 2021-08-12
        • 2020-07-27
        • 2019-06-21
        • 2019-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多