Joe*_*ano 5 file-upload ruby-on-rails google-cloud-storage google-cloud-functions rails-activestorage
我有一个包含图像的用户提交表单。最初我使用的是 Carrierwave,但是在将图像保存到谷歌云服务之前,首先将图像发送到我的服务器进行处理,如果图像/s 太大,请求超时,用户只需获取服务器错误。
所以我需要的是一种直接上传到 GCS 的方法。Active Storage 似乎是完美的解决方案,但我对压缩的难度感到非常困惑。
一个理想的解决方案是在上传时自动调整图像大小,但似乎没有办法做到这一点。
一个次优的解决方案是创建一个调整大小的变种在使用类似的上传@record.images.first.variant(resize_to_limit [xxx,xxx]) #using image_processing gem,但该文档似乎暗示着变体只能在网页加载时被创建,这显然是极其不利的加载时间,尤其是如果有很多图片。对此的更多证据是,当我创建一个变体时,它不在我的 GCS 存储桶中,因此它显然只存在于我的服务器的内存中。如果我尝试
@record.images.first.variant(resize_to_limit [xxx,xxx]).service_url
我得到一个网址,但它无效。当我尝试在我的网站上显示图像时,我得到一个失败的图像,当我访问 url 时,我从 GCS 收到以下错误:
指定的键不存在。没有这样的对象。
所以显然我不能创建一个永久的网址。
一个第三个最好的解决办法是写一个谷歌的云功能,可自动调整大小,谷歌云中的图像,而是通过阅读文档,看来我不得不创建一个新的URL的新调整大小的文件,我不知道我如何用我的数据库中的新网址替换原始网址。
总而言之,我想要完成的是允许直接上传到 GCS,但在用户下载文件之前控制文件的大小。我对 Active Storage 的问题是 (1) 我无法控制 GCS 存储桶上文件的大小,导致任意存储成本,以及 (2) 我显然必须在用户必须下载任意大文件之间进行选择,或者必须在页面加载时处理图像,这两者在服务器成本和加载时间方面都非常昂贵。
以这种方式设置 Active Storage 似乎非常奇怪,我不禁觉得我错过了一些东西。有谁知道解决这两个问题的方法?
我完全不知道Active Storage。然而,适合您的用例的一个好模式是在图像进入时调整图像的大小。为此
注意:您可以使用相同的存储桶(而不是存储桶1和存储桶2),但每次在存储桶中创建文件时都会发送调整图像大小的事件。您可以使用 PubSub 作为中间件并在其上添加过滤器,以仅在正确的文件夹中创建文件时触发您的函数。我写了一篇关于这个的文章
| 归档时间: |
|
| 查看次数: |
156 次 |
| 最近记录: |