LoginSignup
10
8

More than 3 years have passed since last update.

RailsでS3から画像やPDFファイルをダウンロードする方法

Posted at

始めに

Ruby on Railsのアプリケーションでボタンを押すとAmazon S3上にある画像、PDF、動画などをダウンロードする機能実装の仕方の一例です。

ファイル型を指定しないとデフォルトではjpgファイルしかダウンロード出来ない点につまづきました。

regionやbucket、keyなどの情報は自分のS3の設定によって異なってきます。

コントローラーの設定

コントローラー側でdownloadというメソッドでS3からファイルをダウンロードするメソッドを実装します。コントローラー名はDownloadMaterialsControllerとします。

また今回はCredentials情報も直接コントローラーの中に書いていきます。

download_materials_controller.rb

# S3から特定のファイルをダウンロードするメソッド
def download
  region='[自分のregion名]'
  bucket='[自分のbucket名]'
  key= params[:file_name]
  credentials=Aws::Credentials.new(
    '[自分のCredentials情報]',
    '[自分のCredentials情報]',
  )
  # send_dataのtypeはtypeで指定
  client=Aws::S3::Client.new(region:region, credentials:credentials)
  data=client.get_object(bucket:bucket, key:key).body
  send_data data.read, filename: params[:file_name], disposition: 'attachment', type: params[:type]
end

Viewファイルの設定

ダウンロードリンクという文字列に:file_name、:typeというパラメータでそれぞれファイル名とファイルの種類をコントローラーに渡すようにします。Slimを使って書くとすると以下のようになります。

/ pngファイルの場合
= link_to "ダウンロードリンク", download_materials_download_path(:file_name => "取得したいファイル名.png", :type => 'png')

/ pdfファイルの場合
= link_to "ダウンロードリンク", download_materials_download_path(:file_name => "取得したいファイル名.png", :type => 'pdf')

/ mp4ファイルの場合
= link_to "ダウンロードリンク", download_materials_download_path(:file_name => "取得したいファイル名.mp4", :type => 'mp4')

routeファイルの設定

今回はコントローラ名がDownloadMaterialsControllerなのでrouteファイルに

routes.rb
get 'download_materials/download'

を追記しておきます。

最後に

この実装によりリンクをクリックするとDownloadMaterialsControllerのdownloadメソッドからファイルがダウンロードされる仕組みになっています。
またそれぞれのリンクによってパラメータとして渡されるファイル名とファイルの種類の情報によって、それぞれ違うファイルをダウンロード出来るようになっています。
もっと良い実装が出来たら更新したいと思います。少なくとも認証情報は別ファイルに書くべきですね。

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8