Hello World!!
どうも村上です。
ある案件でherokuを使うことがありました。
herokuってすごいですよね。驚くほど簡単にアプリケーション構築できるし、ほとんど無料で使えるし。
その魅力にみせられて案件だけじゃなくて、プライベートでもちょこちょこ使ったりしています。
そこで考えたあるサービスです。
メールで写真共有!!
まぁよくあるサービスですね。。。
ざっとこんな感じです。
てな感じです。
必要なのはアプリケーションサーバーとメールサーバーです。
これを構築しようとしたら面倒です。
でもherokuなら簡単にできます。
アプリケーションサーバーはherokuを使って
メール関連はMailgunというサービスを使います。
ここらへんは増田さんのLABBLOGでわかりやすく説明されてます。
ようするにHTTP経由で受け取ったメッセージ受信したパラメータの中身を見て、添付ファイルがありそうなものを探しだしたらいいです。
Mailgunのドキュメントを参照すると添付ファイルがありそうなパラメータはattachment-xみたいですね。
受信したメールをコントローラーで受け取って中身を見てみると「attachment-1」にファイルオブジェクトがセットされているようです。
おそらく添付ファイルが複数あれば、「x」の部分がインクリメントされていくのだと思います。
あとはこれをストレージに保存したらいいんですけど。herokuにはストレージがないので、今回はAmazonのS3を使います。paperclipを使えば簡単にS3に保存ができます。
まずは、モデルから
モデルの内容は下記の通りです。
論理名 | 物理名 |
---|---|
ID | id |
タイトル | subject |
ボディー | body |
画像名 | photo_file_name |
画像コンテントタイプ | photo_content_type |
画像サイズ | photo_file_size |
画像更新日 | photo_update_at |
次に、s3の設定を記述するs3.ymlをconfigに記述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
development: bucket: picture-app-development access_key_id: S3のアクセスキーを設定 secret_access_key: S3シークレットアクセスキーを設定 test: bucket: picture-app-test access_key_id: S3のアクセスキーを設定 secret_access_key: S3シークレットアクセスキーを設定 production: bucket: picture-app-production access_key_id: S3のアクセスキーを設定 secret_access_key: S3シークレットアクセスキーを設定 |
そしてモデルにpaperclip用の記述を追加
1 2 3 4 5 6 7 8 9 10 |
has_attached_file :photo, :storage=> :s3, :s3_credentials => "#{Rails.root}/config/s3.yml", :url => ":s3_domain_url", :path => ":attachment/:id/:style.:extension", :styles => { :thumb => "100x100>", :medium => "300x300>", :large => "800x800>" } |
これで準備OKです。
最後はコントローラが受け取った添付ファイルをモデルにセットして保存
1 2 3 4 5 6 7 8 9 |
def def mail_post mail_param = { :subject => params[:subject], :body => params[:"body-plain"], :photo => params[:"attachment-1"] } picture = Picture.new(mail_param) picture.save end |
これでメールに添付された写真をストレージに保存することができます。
めっちゃ簡単!!
例では「attachment-x」は「1」に固定してますけど、複数添付ファイル対応するなら「attachment-count」と組み合わせてループさせるのが良いですね。
デコメが添付されてる可能性を考えると少しややこしそう。。。
でも、簡単にアプリケーションを構築できるのはすごい魅力ですし、難しい機能もherokuのadd-onを使えば簡単に実装できます。
ぜひ皆さんもherokuを使ってみて下さい。