javascript - 获取下载 URL 并使其可供其他组件使用

标签 javascript angular firebase firebase-storage angularfire

我是使用 Angular 和 Firebase Storage 的新开发人员。我已成功将文档上传到 Firebase 存储中,但我一直不知道如何获取下载 URL 并使其可供其他组件使用。

我尝试在 Finalize() 之后使用 then 来添加它,但给我带来了一些新问题

import { Component, OnInit } from '@angular/core';
import {AngularFireUploadTask, AngularFireStorage} from '@angular/fire/storage';
import { AngularFirestore } from '@angular/fire/firestore';
import { Observable } from 'rxjs';
import { tap, finalize } from 'rxjs/operators';

@Component({
  selector: 'app-upload-page',
  templateUrl: './upload-page.component.html',
  styleUrls: ['./upload-page.component.css']
})
export class UploadPageComponent implements OnInit {

 task: AngularFireUploadTask;

  // Progress monitoring
  percentage: Observable<number>;

  snapshot: Observable<any>;

  // Download URL
  downloadURL: Observable<string>;

  // State for dropzone CSS toggling
  isHovering: boolean;

  constructor(
    private storage: AngularFireStorage,
    private db: AngularFirestore
  ) {}

  toggleHover(event: boolean) {
    this.isHovering = event;

  }

  startUpload(event: FileList) {
    // The File object
    const file = event.item(0);

    // The storage path
    const path = `documents/${new Date().getTime()}_${file.name}`;

    // metadata
    const customMetadata = { app: 'LKMData in '+ file.type+ ' Format' };

    // The main task
    this.task = this.storage.upload(path, file, { customMetadata });

    // Progress monitoring
    this.percentage = this.task.percentageChanges();
    this.snapshot = this.task.snapshotChanges().pipe(
      tap(snap => {
        if (snap.bytesTransferred === snap.totalBytes) {
          // Update firestore on completion
          this.db.collection('documents').add({ path, size: snap.totalBytes});
        }
      }),
       finalize(() => this.downloadURL = this.storage.ref(path).getDownloadURL())
    );

  }

  // Determines if the upload task is active
  isActive(snapshot) {
    return (
      snapshot.state === 'running' &&
      snapshot.bytesTransferred < snapshot.totalBytes
    );
  }

  ngOnInit() {
  }

}

我希望将下载网址发送到 Firebase 数据库并更新保存上传文件的详细信息,或者有办法使存储中文件的所有网址可供组件使用

最佳答案

StorageReference.getDownloadURL() 方法是异步的。仅当调用完成后,下载 URL 才可用。

所以:

this.storage.ref(path).getDownloadURL().then((url) => {
  this.downloadURL = url;
});

另请参阅:

关于javascript - 获取下载 URL 并使其可供其他组件使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55630774/

相关文章:

javascript - jQuery 周历 : cannot call method 'getTime' of undefined

javascript - 如何修复 'ERROR TypeError: data.slice is not a function'?

javascript - 将数据添加到数据库时,Firebase 函数不会触发

需要 Javascript 循环延迟

javascript - Angular - 在页面加载时触发 $http.get

reactjs - 相当于reactjs中的ng-init

javascript - Firebase 无法使用 "snapshot"访问数据

javascript - 如何确定 JEST 是否正在运行代码?

javascript - NG Admin targetEntity 关系受分页限制

css - 根据 Angular 4 组件中的浏览器加载不同的 CSS 规则