如何从 Firebase Storage 获取图像并在 Angular 2 ngFor 中显示它们

Posted

技术标签:

【中文标题】如何从 Firebase Storage 获取图像并在 Angular 2 ngFor 中显示它们【英文标题】:How can I get image from Firebase Storage and display them in Angular 2 ngFor 【发布时间】:2017-04-24 14:30:09 【问题描述】:

我正在尝试在 *ngFor 中显示从 Firebase Storage 下载的图像。

我成功从存储中获取图像数据,但是我不知道如何在 ngFor 语句中设置图像数据。

让我在这里向您展示我的代码。

<ons-list-item class="list__item list__item--chevron" tappable *ngFor="let request of requests | async" (click)="pushToDetail(request)">
    <ons-row>
      <ons-col ><img [src]="userProfileImg"></ons-col>
      <ons-col style="padding-left:20px;">
        <p class="name"><i class="fa fa-venus fa-fw" aria hidden="true"></i>request.nickName</p>
      </ons-col>
    </ons-row>
</ons-list-item>

这是下载图像的代码。当我订阅 FirebaseListObservable 数据时,我在 foreach 中写了这个。

getProfileImageUrl(userId: string) 
    const userStorageRef = firebase.storage().ref().child('images/users/' + userId + "_users.jpg");
    userStorageRef.getDownloadURL().then(url => 
      this.userProfileImg = url
    );
  

那么我想请你教我如何从 Firebase 存储中读取图像。有什么建议吗?

【问题讨论】:

图像是否对您正在迭代的数组中的每个项目都是唯一的?从上面的代码中,您似乎为所有行显示了相同的图像。 【参考方案1】:

保存图片的名称和数据库的短路径。

使用以下代码上传base64图片;

uploadImage(name, data) 
    let promise = new Promise((res,rej) => 
        let fileName = name + ".jpg";
        let uploadTask = firebase.storage().ref(`/posts/$fileName`).put(data);
        uploadTask.on('state_changed', function(snapshot) 
        , function(error) 
            rej(error);
        , function() 
        var downloadURL = uploadTask.snapshot.downloadURL;
            res(downloadURL);
        );
    );
    return promise;
 

只需 2 行代码即可通过权限安全地获取实际网址。

this.storageRef = firebase.storage().ref().child('images/image.png');
this.storageRef.getDownloadURL().then(url => console.log(url) );

如果您需要更多选项,例如传递字符串、URI 等,您可以查看my blog post about uploading, and getting data from firebase storage using angularfire2.

我希望它对某人有所帮助。

【讨论】:

【参考方案2】:

假设图像对于每个数组元素都是唯一的:

<ons-list-item class="list__item list__item--chevron" tappable *ngFor="let request of requests | async" (click)="pushToDetail(request)">
    <ons-row>
      <ons-col ><img [src]="userProfileImg"></ons-col>
      <ons-col style="padding-left:20px;">
        <p class="name"><i class="fa fa-venus fa-fw" aria hidden="true"></i>request.nickName</p>
      </ons-col>
    </ons-row>
</ons-list-item>

您应该将 [src]="userProfileImg" 更改为返回数组项中每个图像的 URL 的函数,例如 [src]="getUserProfileImage(request)"

在你的组件中:

...
getUserProfileImage(request: TypeOfRequestHere) 
    return 'images/users/' + request.userId + '_users.jpg';

...

更新 或者,这可以在模板中完成:

[src]="'images/users/' + request.userId + '_users.jpg'"

【讨论】:

@taku 乐于助人! @taku 考虑将我的答案选为“已接受”,如果它确实可以让其他人看到的话。谢谢! 嗨,你认为这是一种安全的方式吗? 对这个答案有点困惑。从firebase存储中检索url的问题不是吗?这不只是检索不会从 firebase 存储中提供的静态字符串/图像,而是直接存储在应用程序中吗?

以上是关于如何从 Firebase Storage 获取图像并在 Angular 2 ngFor 中显示它们的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Firebase 存储中获取图像文件名?

如何在图像插入firebase.storage后获取下载URL

如何从 Firebase Storage 获取下载网址?

无法从 firebase/storage 导入 getStorage 以与 React Native Expo 图像选择器一起使用

有没有一种简单的方法可以从 Angular 模板中的 firebase-storage 路径获取下载 url

如何从 Firebase 存储访问图像?