鳥小屋.txt

主に自作ゲームをつくったりしているよ。制作に関することやそうじゃないことのごった煮ブログ

Herokuに画像をアップロードしてAzureのストレージに保存する

f:id:ru_shalm:20140406183343j:plain

どういうわけか

Herokuちゃんはとても便利な子でやりたい放題です。
ちょっとしたものを作りたいなーと思ったら、テケトーに作ってpushしたら勝手に動いててくれます。しかもタダで。自分のVPSとかで動かすようにするとメンテ面倒だし何より有限なリソースをクソアプリに割きたくないので、Herokuちゃんにお願いします。Herokuにゴミを投げつけていくスタイル。

ただHerokuちゃん使うときにちょっと困るのはストレージが無いことです。仕方ないね。 なのでストレージはHerokuちゃん以外に用意してあげる必要があります。

自分のVPSにRiakCSなりそういう感じのものを立ててもいいんですけど、それだとHerokuの意味があんまり無くなってしまうので、ここはストレージも雲の上に載せたい気分。
ちょっとググってみると、AmazonのS3にアップロードするのが良さそうです。



というわけで、Microsoft Azureに投げてみます(

Azureのストレージをつくる

Azureの管理画面からテケトーに作っちゃってください!!!!1111 GUIでサーバが生えていくのなんか不思議ですね。

ストレージをつくったら、コンテナーを1つ追加します。今回はプライベートなやつ作りました。 パブリックBLOBってやつを選ぶと直接アクセスできるモードになるっぽいので、ブログとかの画像置き場にするならパブリックBLOBのほうがよさそうですね。

あと、アクセスキーの管理から謎文字列を回収しておきます。これがないとアップロード出来ない。

RubyでAzureのストレージにアクセス

マイクロソフト公式のgemがあるので便利です。

「Blobs」っていうところにサンプルコード載ってますね。パッと見た感じ、特に難しいこともなく投げたり奪ったりできそうです。

SinatraちゃんでAzureに保存

さっきのサンプルコードを元にこんな感じ。MVCなんてなかった。

  post '/picture' do
    service = Azure::BlobService.new
    File.open(params[:file][:tempfile].path, 'rb') do |file|
      service.create_block_blob('さっき作ったコンテナの名前', 'ファイル名', file.read)
    end
    redirect '/'
  end

簡単ですね! AzureにアクセスするあたりをFileっぽくラップしたものを作れば便利そう。

というわけでゴミを生み出しました

はい、Herokuにゴミを投げつけていくスタイルです。
画像アップローダーになってます。ただしストレージが貯まると困るので最後の1枚しか残りません。
snapchat的な感じですね!(違う)

ちなみにRocketIOのWebSocket的なパワーで、誰かが画像アップロードするとリアルタイムに画像が切り替わります。WebSocketも1度くらい使ってみたかったので……

これでHerokuでもストレージ使えるし、今後のゴミ量産が捗りますね!!!!