【问题标题】:How to return image from a Rails API?如何从 Rails API 返回图像?
【发布时间】:2020-03-26 19:32:20
【问题描述】:

为了澄清,我试图通过本地主机返回我使用机器上的活动存储存储的图像,以用于开发测试目的。我不想将图像从本地主机渲染到互联网。

所以我有一个与图像有has_one_attached 关系的模型,称为样本。

meal.rb:

    include Rails.application.routes.url_helpers
    has_one_attached :sample

    def get_sample_url
        url_for(self.sample)
    end 

所以我使用上面的get_sample_url 来获取图像。它一直在返回一条路径,我只是假设它正在工作,并且已经使用类似的代码构建了我的整个 API 并获得了类似的链接。但是当我把链接放在浏览器中时,它什么也没有返回。

返回的链接是http://localhost:3001/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--c83eba36bfec0607652b47d857104d3cf9e88009/cute%20owl.jpg

我想知道: 是从 Rails API 返回图像的理想方式吗? 为什么链接没有返回我的图像?

【问题讨论】:

  • localhost:3001 部分是问题所在。通过互联网时不会产生任何东西,因为localhost: 在那里不起作用,它只是本地的。 production env 的图像存储在哪里?
  • 对于生产,我的图像使用 Cloudinary 存储。
  • 因此您需要更新该方法以返回适当的 url 以链接到那里的图像才能工作。如果这是一个问题,请将其包装在 if/else 中,这样它仍然可以在本地使用if if Rails.env.production? 来确定要使用的 URL
  • 所以我无法获取存储在 dev 中的 activestorage 中的图像?
  • 您可以,但只能在本地,您不能通过 Internet 访问它们。尝试通过 Internet 访问它们时,您必须使用它们在 Cloudinary 中的 URL。

标签: ruby-on-rails ruby-on-rails-5 rails-activestorage


【解决方案1】:

从 Rails API 返回图像的理想方式是什么?

视情况而定。

如果我们谈论的是 JSON,它实际上并没有二进制类型,因此为了在 JSON 响应本身中包含图像,您需要对其进行 base64 编码。由于这会显着增加文件的大小,因此您实际上只会考虑用于条形码或 QR 码等简单图像。

对于大多数“普通”图像,如用户头像等,您只需在 json 中包含一个 URL,客户端可以在/如果需要图像时请求该 URL。

如果您的应用程序范围很小,您可以使用file system storage。但是 Rails 不会让你的 localhost 对整个互联网可用。

但是,如果您希望您的应用可扩展,请使用快速且分布式的云 CDN。如果您想花时间做其他事情然后进行设置,我会考虑使用带有existing adapter 的 CDN 而不是 Cloudinary。

【讨论】:

  • 我只想在我的本地主机上获取它,现在,我知道如何在生产中处理它。
猜你喜欢
  • 2021-04-16
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多