Problem z send_data i send_file

Witajcie, potrzebuje Waszej porady.

Controller:

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.

Z góry dzięki za pomoc.

Podrzucam przykładowy response header:

Cache-Control: private Connection: Keep-Alive Content-Transfer-Encoding: binary Date: Wed, 21 Jun 2006 16:18:24 GMT Content-Type: text/html; charset=iso-8859-2 Server: WEBrick/1.3.1 (Ruby/1.8.4/2005-12-24) content-disposition: inline; filename="0105a086d52b49a28931415b4a78a2b1.jpg" Content-Length: 105542 Set-Cookie: _session_id=09767b892b79c5d545ab5e27617927fa; path=/

A próbowałeś ustawić ręcznie nagłówek?

class Admin::AssetController < Admin::BaseController layout "panel", :except => :download def download headers['Content-Type'] = 'image/jpeg' asset = AssetFile.find(params[:id]) send_file asset.real_path, {:type => "image/jpeg", :disposition => "inline" } end end

[quote=p_ch]A próbowałeś ustawić ręcznie nagłówek?

      headers['Content-Type'] = 'image/jpeg'

[/quote]
Próbowałem. Nic nie daje - wygląda na to że funkcja send_file je nadpisuje (próbowałem też @headers).

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ć :stuck_out_tongue: Ale teraz to ja mu już jakoś dokopie :slight_smile:

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

Pozdrawiam
Paweł

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.

Dzieki wszystki za pomoc.