URL загрузки Firebase Storage недоступен после загрузки - PullRequest
0 голосов
/ 18 ноября 2018

Я использую Angular и AngularFire2. Я пытаюсь загрузить изображение в хранилище FireBase, затем, как только это будет сделано, я беру эту ссылку и получаю URL-адрес загрузки и загружаю его в базу данных. По какой-то причине, даже несмотря на то, что загрузка завершена, и у меня есть снимок, когда я пытаюсь использовать его для получения URL-адреса, возникает ошибка, что объект не существует. Есть мысли о том, что я могу делать не так?

task.snapshotChanges().pipe(
        concatMap(snap => {
          return snap.ref.getDownloadURL()
        }),
        concatMap(url => this.db.collection('library').add({
          name: this.image.name,
          path: path,
          largeUrl: url
        }))
      ).subscribe(ref => {
        this.completed = true;
      }, error => console.log(error));

ошибка:

Firebase Storage: Object 'library/1542515976022_lemonade-smoothie.jpg' does not exist.

1 Ответ

0 голосов
/ 19 ноября 2018

Хорошо, так что моя проблема была не совсем в понимании concatMap.Я думал, что он не был вызван до последней onNext() загрузки Observable.Он вызывался на первом onNext(), что означает, что файл не был полностью обновлен.Ниже приведено то, что я в итоге сделал, хотя, похоже, должен быть другой путь.Я хотел бы переключиться на новую дорожку Observable только в том случае, если загруженные байты равны общему количеству байтов.Я не уверен, как это сделать с RxJS, хотя.Если у кого-то были мысли, дайте мне знать.

task
   .snapshotChanges()
   .pipe(finalize(() => this.uploadToDb(path)))
   .subscribe();

uploadToDb(path: string) {
    this.storage
      .ref(path)
      .getDownloadURL()
      .pipe(
        concatMap(url =>
          this.db.collection('library').add({
            name: this.image.name,
            path: path,
            largeUrl: url
          })
        )
      )
      .subscribe(
        ref => (this.completed = true),
        error => {
          console.log(error);
          this.error = true;
        }
      );
  }
...