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を使ってみて下さい。

 
						