Rails - Как отправить изображение с контроллера - PullRequest
18 голосов
/ 08 марта 2011

в моем приложении 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 и сделать веб-вызов обратно на мой собственный сервер?

Спасибо

Ответы [ 2 ]

43 голосов
/ 21 февраля 2012

Не лучше ли вместо этого использовать send_file?

send_file Rails.root.join("public", "file.gif"), type: "image/gif", disposition: "inline"
16 голосов
/ 08 марта 2011

Существует ли причина, по которой вы не можете сохранить файл на public/_ctrack.gif, удалить маршрут и позволить базовому веб-серверу обслуживать образ?

Если вам нужно обработать образ с диска, просто используйтеopen по локальному имени файла:

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

* rb устанавливает для файла режимы open и binary.

...