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から参照して表示する簡単なサンプルコード。
paramsのfileの値を見て、なんか入ってたら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でファイルアップロード | ゆーすけぶろぐ