如何使用 Picasso 使用动态 URL 缓存来自 S3 存储桶的图像?

Posted

技术标签:

【中文标题】如何使用 Picasso 使用动态 URL 缓存来自 S3 存储桶的图像?【英文标题】:How to cache images from S3 bucket with dynamic URL using Picasso? 【发布时间】:2019-11-04 05:34:03 【问题描述】:

我正在使用 Picasso 使用动态 URL(预签名 URL)从我的私有 S3 存储桶加载图像。问题是每次我想显示相同的图像时,它都会创建一个新的 URL 并再次下载它,而不是缓存相同的图像并显示它。

有没有办法在使用不同的 URL 时缓存相同的图像?

示例代码:

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(new Date());
    calendar.add(Calendar.HOUR, +6);
    Date date = calendar.getTime();

    URL url = s3.generatePresignedUrl(
            "my-bucket",
            "my-image.jpg,
            date
    );
    String urlString = url.toString();

    Picasso.get()
            .load(urlString)
            .into(imageView);

动态网址示例:

第一次点击后:https://s3.us-east-2.amazonaws.com/my-bucket/my-image.jpg?...&X-Amz-Signature=96dd696fdaf464fa42b2416f6261ba05e17d585578816e854e0a97a2782d177c

第二次点击后:https://s3.us-east-2.amazonaws.com/my-bucket/my-image.jpg?...&X-Amz-Signature=8733d7fc9788759a851cf12fb1d1118584ca1f7cc33dc210b3fea4f762707b82

如您所见,生成的 URL 的第一部分始终相同,唯一改变的是 X-Amz-Signature 之后的部分。

我使用预签名 URL 的唯一原因是为了提高安全性。我想对我的 S3 存储桶进行私有访问,以避免从未知来源等强制下载。

【问题讨论】:

你有机会读到这个吗? ***.com/a/23281195/2684(不是我同意这一点,但是……我不喜欢毕加索)。人们可以随心所欲地说,我使用毕加索(很多)的每个项目,当你想做更多事情时总是不太灵活(就像你在这里)。 谢谢你。我还发现 Glide 库可以帮助解决我的问题。我会试试看它是否有效。 我通过使用 Avinash Gupta 的这个类,设法让它与 Glide 一起工作:***.com/questions/40550729/… 【参考方案1】:

为什么不使用 Glide,它会自动处理内存和磁盘的缓存。它真的很好,运行顺利。

你可以去他们的官方LINK了解更多。

【讨论】:

以上是关于如何使用 Picasso 使用动态 URL 缓存来自 S3 存储桶的图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Picasso 中使用磁盘缓存?

将图像 url 设置为 listadapter 以使用 Picasso 显示图像

HTTP静态资源缓存永远策略

Kotlin 中如何使用 Picasso 将 URL 转换为位图?

Picasso

使用 Picasso 和 OkHttp 更新/更改缓存位图