2009-03-05 3 views
7

확장자가 .ppt 인 파일을 다운로드 할 수있는 컨트롤러 동작이 있습니다. 이것은 파워 포인트 바이너리가 아니라 파워 포인트가 읽을 수있는 xml-ish 포맷입니다. 파일은 ElementsController라는 컨트롤러의 show 액션에서 다운로드되지만 show 액션은 실제로 컨트롤러에 정의되어 있지 않습니다. 그러나 app ​​/ views/elements/show.ppt.builder에 템플릿에 대한 템플릿 파일이 있습니다. 나는 같은 설정/초기화/mime_types.rb에 등록 된 마임 :: 유형이 있습니다레일스 응용 프로그램에서 다운로드 한 파일의 파일 이름을 설정합니다.

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

제대로 파일 다운로드 및 Windows 시스템에서 파워 포인트 열리고, 아직 문제는 파일 이름입니다. 파일의 이름은 3.ppt이며, 여기서 3은 URL의 id 매개 변수입니다. 파일 이름을 3.ppt보다 좀 더 설명하기 쉬운 것으로 설정했는지 알고 싶습니다.

들으,

-C

답변

18

당신은 사용할 수 send_data :

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

이의 또 다른 장점은 '당신이 잡종/얇은 ISN있어 있도록, X-sendfile을 사용할 수있다 클라이언트가 데이터를 다운로드하는 동안 대기합니다. 어떤 id 매개 변수는 보낼 수 FilesController에 대한 당신의 쇼 방법에

그런

/elements/3/files/foo.ppt :


또 다른 옵션은 같은 경로가하는 것 .

+0

컨트롤러에서 respond_to do | format |을 정의하십시오. 이것은 피하려고하는 것입니다. –

+0

respond_to의 문제점은 무엇입니까? – jonnii

+0

다른 질문으로 내 질문을 업데이트했습니다. – jonnii

11

가능한 예 :

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

고마워,이 대답은 내가 [내 자신의 질문] (http://stackoverflow.com/questions/12902052/rails-3-set-the-filename-in-a-respond-to/12902958) 대답하는 데 도움이. –

3

확인. 이것은 아주 오래된 질문에 대한 답이지만, 가장 간단한 방법은 설정하는 것입니다 레일 3.2로 좋아 :

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

SEND_DATA의 문제는 내가 방법을 개방해야한다는 것입니다
관련 문제