使用flutter将多张图片上传到firestore并获取它的下载URL并将所有URL保存到firebase

Posted

技术标签:

【中文标题】使用flutter将多张图片上传到firestore并获取它的下载URL并将所有URL保存到firebase【英文标题】:Upload multi images to firestore using flutter and get it's download URLs and save all of URLs to firebase 【发布时间】:2020-04-14 16:55:12 【问题描述】:

我有一个要上传图像的表单,当用户尝试按下“提交”按钮时,我正在尝试将图像列表上传到 firestore 并获取其所有 URL,然后将表单提交到“x”在firebase中收集,但在上传图像并获取它的URL之前完成了“x”搭配的写作。

我认为 (async,await) 有问题。

感谢您帮助我。

List<File> imagePaths= new List() ;
List<String> imageURL= new List() ;

Future<FirebaseUser> getUser() async 
    return await _auth.currentUser();


Future<void> uploadPic(File _image) async 

    String fileName = basename(_image.path);
    StorageReference firebaseStorageRef = 
    FirebaseStorage.instance.ref().child(Random().nextInt(10000).toString()+fileName);
    StorageUploadTask uploadTask = firebaseStorageRef.putFile(_image);
    var downloadURL = await(await uploadTask.onComplete).ref.getDownloadURL();
    var url =downloadURL.toString();
    imageURL.add(url); // imageURL is a global list that suppose to contain images URLs
    print("\n ---------------------------\n downloadURL :"+ url);
    print("\n ---------------------------\n imageURL :"+ imageURL.toString());

  


Submit(BuildContext context)   
    //imagePaths is list of file 
    imagePaths.add(Front_image);
    imagePaths.add(Back_image);

    imagePaths.forEach((x)  => 
       uploadPic(x)
    );


    getUser().then((user) 

      crudObj.addNew(
        'uid': user.uid,
        'name': name,
        'images':imageURL,
      ).then((result) 
        Navigator.pop(context);

      ).catchError((e) 
        print(e);
      );
    );

  

【问题讨论】:

【参考方案1】:

只有在上传任务完成后,您才应该调用 Submit。我建议实施这样的事情:

Stream uploadImageToFirebaseStorage(File image, String fullPath) 
  final StorageReference firebaseStorageRef =
      FirebaseStorage.instance.ref().child(fullPath);
  StorageUploadTask task = firebaseStorageRef.putFile(image);

  return task.events;

然后监听这个 Stream 然后才提交:

uploadImageToFirebaseStorage(
  image, 'path/imagename.jpg'
).listen((data) async 
  StorageTaskEvent event = data;
  if (data.type == StorageTaskEventType.success) 
    String downloadUrl = await event.snapshot.ref.getDownloadURL();
    await Submit(title, imageUrl: downloadUrl);
    return true;
  
  if (data.type == StorageTaskEventType.failure) return false;
);

请注意,我没有重写你的代码,我正在分享一个可能的实现。

【讨论】:

但是我有多张图片而不是一张图片 那你需要为每张图片运行代码,有什么问题? 在您的解决方案中,我将把表单作为图像数量。一旦所有图片网址准备就绪,我需要提交表单

以上是关于使用flutter将多张图片上传到firestore并获取它的下载URL并将所有URL保存到firebase的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 HTTP 将多张图片上传到 Flutter 中的 Rest API?

Flutter 无法上传从 multi_image_picker 获取的多张图片

Firebase 上传多个 Storage/Firestore

使用 Flutter 将表单上传到 Firestore

如何在 Flutter 中使用 Dio 和 multi_image_picker 插件上传多张图片

Flutter将图像上传到firebase存储然后将其写入firestore