@angular/fire AngularFireStorage getDownloadUrl()

Posted

技术标签:

【中文标题】@angular/fire AngularFireStorage getDownloadUrl()【英文标题】: 【发布时间】:2019-04-28 01:10:36 【问题描述】:

我正在尝试使用新的@angular/fire 5.1.0 使用 AngularFireStorage 查看上传到 firebase 的图像。 我以前可以在 angularfire2 中使用task.downloadURL()

"如果我错了请纠正我,但现在我必须使用afStorage.getDownloadURL() 请您帮助我正确设置 imageUrl。

import  AngularFireStorage, AngularFireStorageReference, AngularFireUploadTask  from '@angular/fire/storage'
....
        downloadURL: Observable<string>; 
        imageUrl: string;
....

async onGetFromGallery()
  try ....
    const imageData = await this.camera.getPicture(options);
    const image = 'data:image/jpeg;base64,' + imageData;
    const id = Math.random().toString(36).substring(2);
    const user = this.authenticatorService.getUser();
    this.ref = this.afStorage.ref(user.uid + '/images/categories/'+id);
    this.task = this.ref.putString(image, 'data_url');

    //--- Previously:angularfire2:
    // this.downloadURL = this.ref.getDownloadURL();
    // this.downloadURL.subscribe(url=> this.imageUrl=url);
    //--- now replaced by this.ref.getDownloadURL()...

    //My Attempt - unable to getDownloadUrl?
    this.task
    .snapshotChanges().toPromise().then(_ =>
       
        this.ref.getDownloadURL().toPromise().then(res => 
          console.log('URL: ', res);
          this.imageUrl = res;
        );
      )

   catch(e) 
    console.error(e);
    this.errorMessage = JSON.stringify(e);
  

查看摘录:

<img [src]="imageUrl"  style="width:100%;">

package.json 摘录:

"@angular/compiler-cli": "5.2.11", "@angular/fire": "^5.1.0", “火力基地”:“^5.5.9”, "cordova-android": "~7.0.0",

谢谢。

【问题讨论】:

根据github.com/angular/angularfire2/blob/master/docs/storage/…,你应该只需要this.imageUrl = ref.getDownloadURL() 请查看https://***.com/a/57267424/11127383 以了解此时它是如何工作的。 【参考方案1】:

代码中还有一些其他小的结构变化,不仅仅是重命名方法。

查看标题为“监控上传百分比”部分下的the example code in the official AngularFire2 docs。具体来说,它们包括的示例上传功能:

uploadFile(event) 
    const file = event.target.files[0];
    const filePath = 'name-your-file-path-here';
    const fileRef = this.storage.ref(filePath);
    const task = this.storage.upload(filePath, file);

    // observe percentage changes
    this.uploadPercent = task.percentageChanges();

    // get notified when the download URL is available
    task.snapshotChanges().pipe(
        finalize(() => this.downloadURL = fileRef.getDownloadURL() )
     )
    .subscribe()

更具体地说,该函数的这一部分,监听器......

// get notified when the download URL is available
task.snapshotChanges().pipe(
    finalize(() => this.imageUrl = fileRef.getDownloadURL() )
 )
.subscribe()

它会在上传完成并使用 URL 填充 this.downloadURL 变量时触发。您已经定义了fileRef,在您的代码中它只是ref,所以以下应该可以工作,但未经测试:

    // get notified when the download URL is available
    task.snapshotChanges().pipe(
        finalize(() => this.downloadURL = ref.getDownloadURL() )
     )
    .subscribe()

【讨论】:

谢谢杰里米。只有最后一件事。我在测试时收到以下错误:[ts] 找不到名称“finalize”。 [2304]。我错过了导入还是什么? 听起来很像,你需要在该组件的顶部import finalize from 'rxjs/operators'; 嗨@JeremyW。请您帮忙解答后续问题吗?谢谢 ;-) ***.com/questions/53853189/…

以上是关于@angular/fire AngularFireStorage getDownloadUrl()的主要内容,如果未能解决你的问题,请参考以下文章

使用 Angular fire 设置 Firestore 会导致:NullInjectorError: R3InjectorError(HomePageModule)

Observable 在 display 、 ionic app 和 angular fire 从 firestore 获取值后失去价值

如何修复:“@angular/fire”'没有导出成员 'AngularFireModule'.ts(2305) ionic、firebase、angular

在 VScode 中找不到 @angular/fire/firestore 模块错误

如何将@angular/fire 添加到 Nx 工作区(Angular 项目)?

Angular2 fire 没有导出成员“FirebaseListObservable”