CarrierWaveとaws-fogを用いてS3上にアップロードしたファイルをローカルにダウンロードする方法を説明します。 サイズの大きいファイルを一旦ローカルにダンロードしてから処理したいケースなどに活用できるかと思います。
実装
モデルの定義
class Invoice < ApplicationRecord mount_uploader :csv_data, CsvUploader end
- Invoiceモデルのcsv_dataという項目にCarrierWaveをマウントします
ダウンロード処理
user = User.find(params[:id]) temp_file = Tempfile.new # ダウロード対象がバイナリの場合は下記も実行 # temp_file.binmode URI.parse(user.csv_data.file.url).open do |file| temp_file.write(file.read) temp_file.close end
- user.csv_data.file.urlを実行するとS3オブジェクトの署名付きURLが返却されます
- Tempfileを作成して、URI.openでS3オブジェクトを取得してファイルに書き込みます。
ダウンロードしたファイルを使う
例えば、ダウンロードしたCSVファイル使って取込処理を実装する場合は以下のようになります。
File.open(temp_file) do |file| CSV.new(file).each do |row| # 取り込み処理を実装する end end