如何从firebase存储下载具有特定大小的图像

时间:2017-02-27 08:09:26

标签: android firebase firebase-storage android-glide

我在我的Android应用程序中使用firebase存储来存储用户上传的图像。 上传的所有图片均为方形。 我发现下载这些图像消耗了大量的用户带宽,我希望通过减少下载到方形imageview 的图像大小来减少这种消耗

我正在使用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的结果

工作!图像正在出现但就像整个图像被下载消耗了大量带宽。我只想要下载自定义尺寸的图像,例如200px×200px。

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

修改

我尝试从浏览器访问我的某个图片https://firebasestorage.googleapis.com/....m.png,并将其成功加载到网页。但是当我尝试将特定参数调整到我的图片网址链接https://firebasestorage.googleapis.com/....m.png?w=100&h=100时,网页上就会出现错误

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

2 个答案:

答案 0 :(得分:2)

我终于可以使用MyUrlLoader

从firebase存储中下载图像了

你知道,firebase存储网址看起来像这样

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&amp; h = 200)

答案 1 :(得分:0)

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

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
        }
    });