暇人じゃない

Sinatra で画像を出力する

send_file を使用して画像ファイルを配信する方法ではなく、DB などに保存していたバイナリデータを直接出力する方法です。

get '/images/:id' do |id|
  # レコード取得
  @item = Item.where(:id => id).first

  if @item and @item.image
    # content_type をセット(image/jpeg など)
    content_type @item.image.content_type
    # 画像を出力
    @item.image.body
  else
    # 404
    not_found
  end
end

http://localhost:4567/images/3 などとアクセスすると画像が出力されます。

もし画像を保存させたいのであれば、画像を出力する前に、Content-Disposition ヘッダをセットしてあげます。

response["Content-Disposition"] = "attachment"

send_dataというメソッドが以前は存在していたらしいですが、1.0 系から削除されたみたいです。

あと数分で2012年ですが、来年はもっとブログを書いて行きたいと思います。 どうぞよろしくお願いします!