class Admin::AssetController < Admin::BaseController
layout "panel", :except => :download
def download
asset = AssetFile.find(params[:id])
send_file asset.real_path, {:type => "image/jpeg", :disposition => "inline" }
end
end
Widok
<table>
<% for a in @assets %>
<tr>
<td><%= link_to a.name, :action => :download, :id => a %></td>
</tr>
<% end %>
</table>
Gdy klikam w link w firefoxie to wyskakuja mi krzaki zamiast obrazka, tak samo w operze 9.
Natomiast w przypadku IE dziala.
Obejzalem naglowki jakie sa wysylane do przegladarki i jezeli wierzyc webdeveloperowi i live headers to railsy i tak wysylaja Content-Type: text/html.
Próbowałem różne kombinacje, send_file, send_data, disposition istawione na inline, attachment, różne serwery (webrick, lighttpd, mongrel) - zawsze taki sam wynik.
Macie jakies pomysly jak to rozwiazac ? Wiem ze moglbym wyrzucic pliki do publica i podawac urla do nich, ale docelowo chcialbym zabezpieczyc te pliki przed sciaganiem przez nie zarejestrowanych userow.
Tracked ! miałem before_filter który ustawia mi kodowanie :
class ApplicationController < ActionController::Base
before_filter :set_charset
def set_charset
@headers["Content-type"] = "text/html; charset=iso-8859-2"
end
end
Nie wiem tylko dlaczego kretyna nie można overloadować Ale teraz to ja mu już jakoś dokopie
Oto pełne rozwiązanie:
class ApplicationController < ActionController::Base
before_filter :set_charset
def set_charset
@headers["Content-type"] = "text/html; charset=iso-8859-2"
end
end
class Admin::AssetController < Admin::BaseController
skip_before_filter :set_charset, :only => :download
def download
(...)
end
end
Zamiast bawić się ze ‘skip_before_filter’ możesz se ustawić ‘after_filter’ jak to ja napisałem w tym poście. Wtedy unikniesz wszystkich tego typu problemów, gdyż filtr jest nakladany o ustawieniu Content-type.
Probowalem cos takiego zrobic, ale nie działalo. Wkleilem Twoj kod i o dziwo tez nie zadzialalo.
Dopiero takie ustawienia daly efekt
class ApplicationController < ActionController::Base
after_filter :set_charset
def set_charset
content_type = @headers["Content-Type"]
if content_type =~ /^text\// or content_type.nil?
@headers["Content-Type"] = "text/html; charset=iso-8859-2"
end
end
end
O dziwo, jezeli nie ma specjalnie ustawionego content_type to przychodzi nil.