Posted at

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


始めに

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メソッドからファイルがダウンロードされる仕組みになっています。

またそれぞれのリンクによってパラメータとして渡されるファイル名とファイルの種類の情報によって、それぞれ違うファイルをダウンロード出来るようになっています。

もっと良い実装が出来たら更新したいと思います。少なくとも認証情報は別ファイルに書くべきですね。