繁体   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