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: