2009-03-05 9 views
7

Mam działanie kontrolera, które pozwala użytkownikowi pobrać plik z rozszerzeniem .ppt. To naprawdę nie jest binarny powerpoint, tylko format xml-ish, który powerpoint może odczytać. plik jest pobierany z akcji show kontrolera o nazwie ElementsController, ale akcja show nie jest faktycznie zdefiniowana w kontrolerze, istnieje jednak plik szablonu dla niego w app/views/elements/show.ppt.builder. Mam Mime :: typu zarejestrowanych w config/inicjalizatorów/mime_types.rb jako takie:ustawianie nazwy pliku dla pobranego pliku w aplikacji szyny

Mime::Type.register "multipart/related", :ppt

i pobieranie plików prawidłowo i otwiera PowerPoint w systemie Windows, ale problemem jest to nazwa pliku. nazwa pliku to 3.ppt, gdzie trzy to parametr id w adresie URL. Chciałbym wiedzieć, czy istnieje sposób na ustawienie nazwy pliku na coś bardziej opisowego niż 3.ppt.

thx,

-C

Odpowiedz

18

można użyć send_data:

send_data pptdata, :filename => 'your_file_name.ppt', 
    :disposition => 'inline', :type => "multipart/related" 

Kolejną zaletą jest to można użyć x-Sendfile, tak, że jesteś kundel/cienki ISN” t oczekiwania podczas pobierania danych przez klienta.


Innym rozwiązaniem byłoby mieć trasy jak:

/elements/3/files/foo.ppt

Następnie w metodzie pokazu dla FilesController można wysłać cokolwiek parametr id byłoby.

+0

problem z send_data jest to, że będzie musiał otworzyć się metodę w kontrolerze i zdefiniuj respond_to do | format |, czego staram się uniknąć. –

+0

Co jest nie tak z odpowiedzią? – jonnii

+0

Zaktualizowałem moje pytanie innym pomysłem. – jonnii

11

możliwy przykład:

def show 
    @item = Item.find(params[:id]) 
    respond_to do |format| 
     format.html # show.html.erb 
     format.ppt { 
      response.headers['Content-Disposition'] = "attachment; filename=\"#{@item.filename}.ppt\"" 
     } # show.ppt.erb 
     format.xml { render :xml => @item } 
    end 
end 
+0

Dzięki, ta odpowiedź pomogła mi odpowiedzieć [moje własne pytanie] (http://stackoverflow.com/questions/12902052/rails-3-set-the-filename-in-a-respond-to/12902958). –

3

OK. Jest to odpowiedź na bardzo stare pytanie, ale jak Rails 3.2 Najprościej jest ustawić go lubię:

respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @product } 
    format.csv { send_data @product.to_csv, :filename => "New-Product-filename.csv" } 
    format.xls 
end 

Source API Doc