7

ドキュメントをアップロードできるアップローダーがあります。私がやりたいのは、ドキュメントの表示アクションを表示したときにドキュメントのダウンロードをトリガーすることです。URLは次のようになります。

/documents/16

このドキュメントは、.txtまたは.docである可能性があります。

これまでのところ、私のショーアクションは次のようになっています。

  def show
    @document = Document.find(params[:id])
    respond_with(@document) do |format|
      format.html do
        render layout: false, text: @document.name
      end
    end
  end

これを達成するにはどうすればよいですか?

4

2 に答える 2

15

send_dataメソッドを見てください。

指定されたバイナリデータをブラウザに送信します。このメソッドは、render:text => dataに似ていますが、ブラウザーが応答をファイルの添付ファイル(つまり、ダウンロードダイアログ)として表示するか、インラインデータとして表示するかを指定することもできます。コンテンツタイプ、見かけのファイル名などを設定することもできます。

だから、あなたの場合、それはこのようなものでなければならないと思います:

def show
  @document = Document.find(params[:id])
  send_data @document.file.read, filename: @document.name
end
于 2012-08-19T18:51:51.350 に答える
3

コントローラにファイルをダウンロードするための新しいメソッドを作成しました。こんな感じです。Stored_Fileはアーカイブされたファイルの名前であり、ファイルの名前であるstored_fileというフィールドがあります。Carrierwaveを使用して、ユーザーがファイルをダウンロードするためのアクセス/権限を持っている場合、URLが表示され、send_fileを使用してファイルがユーザーに送信されます。

コントローラ

 def download
    head(:not_found) and return if (stored_file = StoredFile.find_by_id(params[:id])).nil?

    case SEND_FILE_METHOD
      when :apache then send_file_options[:x_sendfile] = true
      when :nginx then head(:x_accel_redirect => path.gsub(Rails.root, ''), :content_type => send_file_options[:type]) and return
    end
    path = "/#{stored_file.stored_file}"

    send_file path, :x_sendfile=>true

  end

意見

<%= link_to "Download", File.basename(f.stored_file.url) %>

ルート

match ":id/:basename.:extension.download", :controller => "stored_files", :action => "download", :conditions => { :method => :get }
于 2012-08-19T18:52:59.577 に答える