Ruby on rails Rails-如何从控制器发送图像

Ruby on rails Rails-如何从控制器发送图像,ruby-on-rails,ruby-on-rails-3,open-uri,Ruby On Rails,Ruby On Rails 3,Open Uri,在我的rails应用程序中,我需要传回一个图像 我的路线中有一个1x1.gif跟踪像素,如下所示: match "/_ctrack.gif" => "email_tracking_pixels#my_method" 在控制器中: def my_method send_data open('https://www.xxxxxx.com/images/1x1_transparent.gif') {|f| f.read }, :filename => '1x1_transpar

在我的rails应用程序中,我需要传回一个图像

我的路线中有一个1x1.gif跟踪像素,如下所示:

 match "/_ctrack.gif" => "email_tracking_pixels#my_method"
在控制器中:

def my_method
    send_data open('https://www.xxxxxx.com/images/1x1_transparent.gif') {|f| f.read }, :filename => '1x1_transparent.gif', :type => 'image/gif'
end
问题是,出于某种原因,有时这会超时。出现以下错误:

2011-03-07T20:08:36-08:00 heroku[router]: Error H12 (Request timeout) -> GET www.xxxxxxx.com/images/1x1_transparent.gif dyno=web.1 queue=0 wait=0ms service=0ms bytes=0
2011-03-07T20:08:36-08:00 app[web.1]: 
2011-03-07T20:08:36-08:00 app[web.1]: OpenURI::HTTPError (503 Service Unavailable):
2011-03-07T20:08:36-08:00 app[web.1]:   app/controllers/email_tracking_pixels_controller.rb:19:in `my_method'
2011-03-07T20:08:36-08:00 app[web.1]:   lib/rack/www.rb:7:in `call'
关于如何传递本地存储的图像,而不是使用open并向自己的服务器回拨web电话,有什么想法吗


谢谢

有什么原因导致您无法将文件保存到
public/\u ctrack.gif
、删除路由并让底层web服务器为图像提供服务

如果需要处理磁盘上的映像,只需在本地文件名上使用:

send_data open("#{Rails.root}/path/to/file.gif", "rb") { |f| f.read } .......

rb
将文件设置为
open
binary
模式。

使用send\u file不是更好吗

send_file Rails.root.join("public", "file.gif"), type: "image/gif", disposition: "inline"

我不知道open可以做到这一点。我还没有测试过它,但它也可以工作,不需要块,完成后关闭文件:
send_data file.read(“/path/to/file”),:mode=>“rb”),:filename=>“1x1_transparent.gif”,:type=>'image/gif'
send_file
将是一个更好的选择,可以利用web服务器中的X-SendFile或X-Accel-Redirect头来避免占用ruby进程。这在客户端提供了更好的行为。