【问题标题】:Rendering an image渲染图像
【发布时间】:2011-02-27 21:36:51
【问题描述】:

所以这应该很容易,但我无法让它工作。

我有一个控制器方法,可以根据查询查找图像,然后缓存输出。图片可以是远程的(flickr、google 图片等),也可以是本地的。无论来源如何,我只需要获取图像文件内容,并将其传递给用户。本质上是一个代理。通过远程图像似乎工作正常,但通过本地图像给我一个:

invalid byte sequence in UTF-8

这就是我得到的。我希望有人可以用我的代码解决问题或指导我朝着更好的方向发展。

def image_proxy
  query = params[:query]
  image_url = get_image_url(query) # returns an absolute local file path or a URL

  response.headers['Cache-Control'] = "public, max-age=#{12.hours.to_i}"
  response.headers['Content-Type'] = 'image/jpeg'
  response.headers['Content-Disposition'] = 'inline'
  render :text => open(image_url).read
end

远程文件工作正常,本地文件不行。

奖励任何可以帮助解决此其他问题的人:

  1. 我需要设置正确的内容类型。远程图像 url 不告诉我图像类型,我只是得到一个 url,有时 url 不包含扩展名。所以我选择了 jpeg,因为无论发送给我的图像类型如何,它似乎都能正常工作。

谢谢!

【问题讨论】:

    标签: ruby-on-rails image proxy


    【解决方案1】:

    尝试使用render :text => open(image_url, "rb").read,它告诉 Ruby 它打开的文件是二进制文件,而不是尝试将其读取为文本。

    编辑

    对于附加问题,您可以阅读前几个字节并查看它们包含的内容。 PNG 将始终以十六进制字节值 89 50 4E 47 0D 0A 1A 0A(或十进制值 137 80 78 71 13 10 26 10)开头。

    维基百科有一个list of magic numbers used to identify file,您可以查看。只需创建某种方法来读取前几个字节并将其与之进行比较。

    【讨论】:

      【解决方案2】:

      什么版本的 Rails?对于 Rails 3,您应该查看添加的 streaming methods。 send_data 将是发送二进制数据的正确方法。如果图像是本地的,并且您的 Web 服务器支持它,您可以使用 send_file,它不会在用户下载图像时阻止 rails 实例。

      【讨论】:

      • 是的,send_data 是你想要的,而不是 render
      猜你喜欢
      • 2022-12-21
      • 2017-09-17
      • 2016-04-23
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      相关资源
      最近更新 更多