скачать URL из хранилища Firebase пусто - PullRequest
2 голосов
/ 11 мая 2019

Я использую ionic 4 для загрузки изображения с камеры в хранилище файловой базы. загрузка идет нормально, но мне трудно получить URL загрузки. мой код выглядит следующим образом:

async getFromCamera(){
    this.camera.getPicture({
      destinationType: this.camera.DestinationType.DATA_URL,
      quality: 25,
      correctOrientation: true,
        allowEdit:false
  }).then(async (imageData) => {
      var base64Image = "data:image/jpeg;base64," + imageData;
      this.uploadToFireStore(base64Image).then(
            (data) => console.log("done to firestore:"  + data),
            (err) => console.log("The error to upload is:::" + JSON.stringify(err))
          )
  }, (err) => {
      console.log("Error found is:" + err);
  });
  }

  uploadPercent
  downloadURL

  uploadToFireStore(imageData){
   return new Promise<any>((resolve, reject) => {
    let storageRef = this.storage.ref('/');
    let imageRef = storageRef.child('myimage')
    const task = imageRef.putString(imageData, 'data_url')

      console.log("Task is:::" + task)
       // observe percentage changes
    this.uploadPercent = task.percentageChanges();
    // get notified when the download URL is available
    task.snapshotChanges().pipe(
        finalize(() => {
                            this.downloadURL = imageRef.getDownloadURL() 
                            console.log("upload percent:" + JSON.stringify(this.uploadPercent))
                            console.log("download url is::" + JSON.stringify(this.downloadURL))
                      } 
                )
     )
    .subscribe()
  })
  }

Ответ, который я вижу:

upload percent:{"_isScalar":false,"source":{"_isScalar":false},"operator":{}}
/tab1-tab1-module.js:629 download url is::{"_isScalar":false}

1 Ответ

2 голосов
/ 14 мая 2019

Firebase Storage позволяет загружать файлы, поэтому вам не нужно загружать длинные base64 строки. Почему вы все еще хотите загрузить base64?

Я не знаком с тем, что возвращает метод this.camera.getPicture, но уверен, что это тип File. В этом случае:

}).then(imageData => {
    this.uploadToFireStore(imageData)

И

  uploadToFireStore(imageData){
    let storageRef = this.storage.ref('/');
    let imageRef = storageRef.child('myimage')
    const task = imageRef.upload(imageData, 'data_url')

    this.uploadPercent = task.percentageChanges();
    task.snapshotChanges().pipe(
        finalize( async () => {
          await this.downloadURL = imageRef.getDownloadURL().toPromise();
          console.log('this.downloadURL', this.downloadURL)

                      } 
                )
     )
    .subscribe()

Обратите внимание, что finalize принимает async функцию, потому что imageRef.getDownloadURL() возвращает Observable, так как нам нужно только одно значение из него, и это единственное значение, которое нам нужно для этого потока, он выглядит чище для его преобразования Обещать.

...