【问题标题】:How to download images with specific size from firebase storage如何从 Firebase 存储下载具有特定大小的图像
【发布时间】:2017-07-17 18:20:00
【问题描述】:

我在我的 android 应用程序中使用 firebase 存储来存储用户上传的图像。 所有上传的图片都是方形的。 我发现下载这些图像会消耗大量用户带宽,我想通过减小下载到 方形图像视图

的图像大小来减少这种消耗

我正在使用 Glide 下载这些图像,我尝试下载自定义大小的图像,但图像没有出现在 imageview 上。

界面

public interface MyDataModel {
  public String buildUrl(int width, int height);
}

我的类扩展了 BaseGlideUrlLoader

public class MyUrlLoader extends BaseGlideUrlLoader<MyDataModel> {
  public MyUrlLoader(Context context) {
    super(context);
  }

  @Override
  protected String getUrl(MyDataModel model, int width, int height) {
    // Construct the url for the correct size here.
    return model.buildUrl(width, height);
  }
}

实现 MyDataModel 接口的类

public class CustomImageSize implements MyDataModel {

  private String uri;

  public CustomImageSize(String uri){
    this.uri = uri;
  }

  @Override
  public String buildUrl(int width, int height) {

    return uri + "?w=" + width + "&h=" + height;
  }
}

终于

CustomImageSize size = new CustomImageSize(uri);

  Glide.with(context)
    .using(new MyUrlLoader(context))
    .load(size)
    .centerCrop()
    .priority(Priority.HIGH)
    .into(imageView);

上述解决方案的结果

图像没有出现在我的方形图像视图中

解决方案 2:使用 firebase 图像加载器

    // Reference to an image file in Firebase Storage
StorageReference storageReference = ...;

ImageView imageView = ...;

// Load the image using Glide
Glide.with(this /* context */)
        .using(new FirebaseImageLoader())
        .load(storageReference)
        .into(imageView);

上述解决方案 2 的结果

工作!图像出现了,但是就像整个图像被下载,消耗了大量的带宽。我只想下载一个自定义大小的图像,例如 200 像素 x 200 像素。

如何在上面的解决方案 1 中执行或更改以从 Firebase 存储下载自定义大小的图像?

编辑

我尝试从浏览器访问我的一张图片https://firebasestorage.googleapis.com/....m.png,它已成功加载到网页。但是当我尝试将特定参数设置为我的图片 url 链接 https://firebasestorage.googleapis.com/....m.png?w=100&amp;h=100 时,网页上出现了一个错误

 {
  "error": {
    "code": 403,
    "message": "Permission denied. Could not perform this operation"
  }
}

【问题讨论】:

  • 我不知道您是否可以通过传递“w”和“h”GET 请求来为 Firebase 存储中上传的图像请求特定大小。您能否分享提及此功能的文档或文章?我在官方文档中找不到。
  • @Wilik 找到任何解决方案?

标签: android firebase firebase-storage android-glide


【解决方案1】:

我终于能够使用 MyUrlLoader 类从 firebase 存储下载图像

你看,firebase 存储 url 看起来像这样

firebasestorage.googleapis.com/XXXX.appspot.com/Folder%2Image.png?&alt=media&token=XXX

正如您在上面看到的,链接已经有这个特殊的问号字符? 代表查询字符串的开始所以当我使用CustomImageSize 类时,另一个? 是正在添加,因此链接以两个 ? 结尾,导致下载失败

firebasestorage.googleapis.com/XXXX.appspot.com/Folder%2Image.png?&alt=media&token=XXX?w=200&h=200

解决方案是在我的CustomImageSize 类中删除?。就这样结束了

    public class CustomImageSize implements MyDataModel {

  private String uri;

  public CustomImageSize(String uri){
    this.uri = uri;
  }

  @Override
  public String buildUrl(int width, int height) {

    return uri + "w=" + width + "&h=" + height;
  }
}

虽然下载了,但不确定是下载了整个图像还是仅下载了自定义大小的图像。这是因为,在更正导致查看失败的错误后,我尝试在浏览器中访问该图像,但 我仍然收到了整个图像。不是调整大小的图像(w=200&h=200)

【讨论】:

  • 我认为你只能下载你上传的同一个资源。如果您担心带宽,您可以按照云功能示例创建缩略图并根据您的尺寸需求进行修改。 firebase.google.com/docs/functions/gcp-storage-events
  • 截至目前,此解决方案不起作用。
【解决方案2】:

尝试使用以下命令下载您的图像:-

StorageReference islandRef = storageRef.child("yourImage.jpg");
    // defines the specific size of your image
    final long ONE_MEGABYTE = 1024 * 1024;
    islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
        @Override
        public void onSuccess(byte[] bytes) {
            // Data for "yourImage.jpg" is returns, use this as needed
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle any errors
        }
    });

【讨论】:

  • 这很好但效率不高,OutOfMemoryError 可能会被抛出,这可能会导致应用程序冲突。我想使用 Glide 有效地加载自定义大小的图像
  • 但是代替 ONE_MEGABYTE 常量 1024*1024,您可以根据自己的要求取更少的值。
猜你喜欢
  • 2016-12-28
  • 2019-11-25
  • 2020-01-09
  • 1970-01-01
  • 2011-05-14
  • 2019-06-11
  • 2017-01-16
  • 2021-05-27
  • 1970-01-01
相关资源
最近更新 更多