在本机反应中从数组上传数据到 Firebase 存储和 Firebase 数据库

Posted

技术标签:

【中文标题】在本机反应中从数组上传数据到 Firebase 存储和 Firebase 数据库【英文标题】:Upload data to firebase storage and Firebase database from array in react native 【发布时间】:2019-08-29 17:07:03 【问题描述】:

我有一个数组,其中包含一些图像的本地位置,如下所示。

图像路径= ["file:///data/user/0/com.app.taamoutlet/cache/react-native-image-crop-picker/22536474236950.png","file:///data/user/0/com. app.taamoutlet/cache/react-native-image-crop-picker/22583225016770.png "]

我已经上传了一张图片。 根据您在下面看到的代码,我想将图像上传到 Firebase 存储。我想将数组中的每个图像上传到一个文件夹。然后收集可下载的 URL 和每张图片,并将该信息存储在您所看到的单个产品下

      () => 
        const fs = RNFetchBlob.fs
        const uid = "flyers/" + this.state.productUid;
        const imageRef = firebase.storage().ref(uid).child(Math.random()+".jpg") //string "dp1.jpg"
        let mime = 'image/jpg'

        //------------------------------------------------
        // coverting to base64
        fs.readFile(this.state.imagePath, 'base64')
          .then((data) => 

            //console.log('data='+data);
            return Blob.build(data,  type: `$mime;BASE64` )
          )
          .then((blob) => 
            //uplaoding Image
            uploadBlob = blob
            return imageRef.put(blob,  contentType: mime )
          )
          .then(() => 
            uploadBlob.close()
            //getting url
            return imageRef.getDownloadURL()
          )
          .then((url) => 
            urls = url;
            console.log('urls=' + urls)
            //================================
            try 


              alert("Uploading Flyer" + this.state.title)

              //-------------------------------------------

              //----------Inserting Data to Database--------


              usersTable = 'flyers/' + this.state.productUid,
                console.log(usersTable)
              firebase.database().ref(usersTable).set(
                

                  title: this.state.title,
                  description: this.state.description,
                  imageUrls: url,
                  storename: this.state.storename,
                  user: asyncValue,
                  longitude: this.state.longitude,
                  latitutde: this.state.latitutde
                
              ).then(

                alert(this.state.title + " flyer sucessfully uploaded")
              )
              //--------------------------------------------

            
            catch (error) 
              this.setState( loading: false )
              this.setState( disabled: false )
              console.log(error.toString())
              alert(error.toString())
            
            //================================



          )
      

【问题讨论】:

你必须和Promise.all()“玩”,见developer.mozilla.org/en-US/docs/Web/javascript/Reference/…。在每个then()s 中,您必须管理Promise.all() 返回的结果数组并构建一个新数组以传递给下一个Promise.all() 【参考方案1】:

正如 Renaud 所说,您必须使用 Promise.all。请查看此示例:

const promises = [fs.readFile(this.state.imagePath, 'base64'),...];

return Promise.all(promises).then((arrayOfResults) => 
  const furtherPromises = [...]

  return Promise.all(furtherPromises)
    .then((uploadedFiles) => 
      // action required
  )
    .catch((error) => 
      // action required
    );
  ).catch((error) => 
   // action required
);

【讨论】:

以上是关于在本机反应中从数组上传数据到 Firebase 存储和 Firebase 数据库的主要内容,如果未能解决你的问题,请参考以下文章

减小图像大小后如何将图像上传到firebase反应本机

Firebase 对数组做出本机反应

反应本机图像获取/上传

如何在本机反应中从 json 获取数据?

在本机反应中从 json 对象访问特定数据

如何在本机反应中从相机按钮切换到视频录制按钮