Sinatraでファイルのアップロード

Sinatraでファイルのアップロードをする場合、Rackのparamsを使って行うみたい。

Sinatra 1.1.xでSlim

まず、SinatraでテンプレートエンジンにSlimを使いたい場合は、Sinatra 1.2まで待つか、以下の記事を参考にモジュールを再オープンしてモンキーパッチングすると使えるようになるみたい。

Hamlとたいして変わらないSlim - komagata [p0t]

# Sinatra 1.1.x 以前で Slim を使う
module Sinatra
  module Templates
    def slim(template, options={}, locals={})
      render :slim, template, options, locals
    end
  end
end
Slim::Engine.set_default_options :pretty => true

このパッチを使った場合は@@ layoutは使えないようなので、毎回頭から全部Slimを書いてる。今のところ自分はSlimを本格的には使えてないので問題ないかな。本格的に使えるほど慣れてきた頃には、Sinatra 1.2が出てそう。Slim、シンプルでキモかわいい。

ファイルアップロードのサンプル

フォームからファイルを送信して、そのファイルの情報をparamsから参照して表示する簡単なサンプルコード。 paramsfileの値を見て、なんか入ってたらslimテンプレートを、nilならエラーを表示する。

require 'rubygems'
require 'sinatra'
require 'slim'
# Sinatra 1.1.x 以前で Slim を使う
module Sinatra
  module Templates
    def slim(template, options={}, locals={})
      render :slim, template, options, locals
    end
  end
end
Slim::Engine.set_default_options :pretty => true
get '/' do
    slim :index
end
put '/upload' do
  if @f = params[:file]
    slim :upload
  else
    "アップロードに失敗しました"
  end
end
__END__
@@ index
! doctype html
html
  body
    form action='/upload' method='post' enctype='multipart/form-data'
      input type='file' name='file'
      input type='submit' value='upload'
      input type='hidden' name='_method' value='put'
@@ upload
! doctype html
html
  body
    p = "filename : #{@f[:filename]}"
    p = "type: #{@f[:type]}"
    p = "name: #{@f[:name]}"
    p = "tempfile: #{@f[:tempfile]}"
    p = "head: #{@f[:head]}"

Sinatraでputを使う場合は、フォームでhiddenを使って、_methodという名前で値putを送るのがお作法みたい。あと受け取ったファイルは、Tempfileクラスになっている。余談だけど、Heroku単体ではファイルのアップロードが出来ないのは残念だなあ。ファイルをアップロードしたい場合は、Amazon S3とかを使うみたい。


rack上でのファイルアップロード - daigotoの備忘録 Sinatraでファイルアップロード | ゆーすけぶろぐ