始めに
Ruby on Railsのアプリケーションでボタンを押すとAmazon S3上にある画像、PDF、動画などをダウンロードする機能実装の仕方の一例です。
ファイル型を指定しないとデフォルトではjpgファイルしかダウンロード出来ない点につまづきました。
regionやbucket、keyなどの情報は自分のS3の設定によって異なってきます。
コントローラーの設定
コントローラー側でdownloadというメソッドでS3からファイルをダウンロードするメソッドを実装します。コントローラー名はDownloadMaterialsControllerとします。
また今回はCredentials情報も直接コントローラーの中に書いていきます。
# 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ファイルに
get 'download_materials/download'
を追記しておきます。
最後に
この実装によりリンクをクリックするとDownloadMaterialsControllerのdownloadメソッドからファイルがダウンロードされる仕組みになっています。
またそれぞれのリンクによってパラメータとして渡されるファイル名とファイルの種類の情報によって、それぞれ違うファイルをダウンロード出来るようになっています。
もっと良い実装が出来たら更新したいと思います。少なくとも認証情報は別ファイルに書くべきですね。