RailsとCarrierWave-FTPを使って画像を外部サーバーに保存する方法です。
CarrierWave自体の使い方は、『Rails ダウンロードした画像をCarrierWaveで保存する』を参照ください。
次のドメイン名で説明しています。
- Railsアプリケーション:www.example.com
- 外部サーバー:cdn.example.com
- 外部サーバー内の画像の格納先絶対パス:/home/vagrant/cdn
- いずれもVagrant内
ステップ1. Gemの導入
Gemfileにcarrierwave-ftp
を追加して、bundle install
します。
@Gemfile
gem 'carrierwave', '~> 1.0' gem 'carrierwave-ftp', :require => 'carrierwave/storage/ftp/all'
:require => 'carrierwave/storage/ftp/all'
を指定するとFTP, SFTP兼用の指定になります。
ステップ2. SFTP設定の記述
CarrierWave::Uploader::Base
を継承したクラスにおいて、SFTPの設定を記述します。
class CarrierWaveImageUploader < CarrierWave::Uploader::Base # アップロード先のストレージにSFTPを選択します。 storage :sftp # SFTPの設定を記述 configure do |config| # SFTPホスト名を指定します。 config.sftp_host = "cdn.example.com" # SFTPアカウントユーザー名を指定します。 config.sftp_user = "vagrant" # SFTPアカウントパスワードとポート番号(22固定)を指定します。 config.sftp_options = { :password => "vagrant", :port => 22 } # SFTPホストにおける画像格納先を指定します。 config.sftp_folder = "/home/vagrant/cdn" # 上記、画像格納先を示すURLを指定します。 config.sftp_url = "http://cdn.example.com" end # 上記、画像格納先フォルダ内における格納の仕方を指定します。 # 下の場合、uploadsフォルダ他、色々と階層が作られます。 def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end
上で設定した設定値は、CarrierWaveImageUploader.sftp_url
などとして確認できます。
これで画像が外部サーバーにSFTPで保存されます。画像へのパスが一緒に管理されますので、ブラウザには画像へのURLを渡して表示するようにします。
おわりに
もし保存処理時に、次のように聞かれた場合はSFTP設定が初期値のままになっていることを意味しますので、自分で書いた設定値が使われるように調整が必要です。
anonymous@localhost's password: