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

Foi útil?

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

Fonte API Doc

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top