Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 渲染图像_Ruby On Rails_Image_Proxy - Fatal编程技术网

Ruby on rails 渲染图像

Ruby on rails 渲染图像,ruby-on-rails,image,proxy,Ruby On Rails,Image,Proxy,所以这应该很容易,但我不能让它工作 我有一个控制器方法,它根据查询查找图像,然后缓存输出。图像可以是远程的(flickr、谷歌图像等),也可以是本地的。不管源代码是什么,我只需要获取图像文件的内容,并将其传递给用户。本质上,这是一种代理。通过远程图像似乎可以正常工作,但通过本地图像给了我一个: invalid byte sequence in UTF-8 这就是我得到的。我希望有人能解决这个问题,或者用我的代码引导我朝着更好的方向前进 def image_proxy query = par

所以这应该很容易,但我不能让它工作

我有一个控制器方法,它根据查询查找图像,然后缓存输出。图像可以是远程的(flickr、谷歌图像等),也可以是本地的。不管源代码是什么,我只需要获取图像文件的内容,并将其传递给用户。本质上,这是一种代理。通过远程图像似乎可以正常工作,但通过本地图像给了我一个:

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
远程文件工作正常,本地文件不工作

对任何能够帮助解决其他问题的人的奖励:

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

  • 谢谢

    尝试使用
    render:text=>open(image\u url,“rb”).read
    ,它告诉Ruby它打开的文件是二进制文件,不要尝试将其作为文本读取

    编辑

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


    Wikipedia有一个你可以看的网站。只需创建一种读取前几个字节的方法,并将其与之进行比较。

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

    是的,
    send_data
    是您想要的,而不是
    render