Railsアプリケーションでダウンロードしたファイルのファイル名を設定する

StackOverflow https://stackoverflow.com/questions/617055

質問

ユーザーが拡張子.pptのファイルをダウンロードできるようにするコントローラーアクションがあります。それは実際にはPowerPointバイナリではなく、PowerPointが読み取れるXML風の形式にすぎません。このファイルはElementsControllerというコントローラーのshowアクションからダウンロードされますが、showアクションは実際にはコントローラーで定義されていませんが、app / views / elements / show.ppt.builderにはそのためのテンプレートファイルがあります。 Mime :: Typeがconfig / initializers / mime_types.rbに登録されています:

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

ファイルが適切にダウンロードされ、Windowsシステムでpowerpointで開きますが、問題はファイル名です。ファイルの名前は3.pptで、3はURLのidパラメーターです。ファイル名を3.pptよりもわかりやすい名前に設定する方法があるかどうかを知りたい。

thx、

-C

役に立ちましたか?

解決

send_data を使用できます:

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

これのもう1つの利点は、x-sendfileを使用できることです。これにより、クライアントがデータをダウンロードしている間、あなたは雑種/シンが待っていません。


別のオプションは、次のようなルートを持つことです:

/elements/3/files/foo.ppt

次に、FilesControllerのshowメソッドで、idパラメータを何でも送信できます。

他のヒント

可能な例:

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

わかりました。これは非常に古い質問に対する答えですが、Rails 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

ソースAPIドキュメント

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top