Definindo o nome do arquivo para um arquivo baixado em um aplicativo Rails
-
03-07-2019 - |
Pergunta
Eu tenho uma ação do controlador que permite ao usuário baixar um arquivo com uma extensão do .ppt. Não é realmente um binário do PowerPoint, apenas um formato XML-ish que o PowerPoint pode ler. O arquivo é baixado da ação do show de um controlador chamado ElementScontroller, mas a ação do show não é realmente definida no controlador, no entanto, existe um arquivo de modelo no aplicativo/visualizações/elementos/show.ppt.builder. Eu tenho o MIME :: tipo registrado em config/inicializadores/mime_types.rb como tal:
Mime::Type.register "multipart/related", :ppt
e o arquivo download corretamente e abre com o PowerPoint em um sistema Windows, mas o problema é o nome do arquivo. O nome do arquivo é 3.PPT, onde três é o parâmetro ID no URL. Gostaria de saber se existe uma maneira de definir o nome do arquivo para algo um pouco mais descritivo que 3.ppt.
THX,
-C
Solução
Você poderia usar send_data:
send_data pptdata, :filename => 'your_file_name.ppt',
:disposition => 'inline', :type => "multipart/related"
Outra vantagem disso é que você pode usar o X-Sendfile, para que seja MonGrel/Thin não aguarde enquanto o cliente faz o download dos dados.
Outra opção seria ter uma rota como:
/Elements/3/files/foo.ppt
Então, no seu método de show para o FileScontroller, você pode enviar qualquer que seja o parâmetro ID.
Outras dicas
Um possível exemplo:
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
OK. Esta é uma resposta para uma pergunta muito antiga, mas a partir do Rails 3.2, a maneira mais simples é defini -la como:
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