人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Rubyで
FORMのFILEタグ
(例:<input type="file" name="filename" size="50">)
で指定したファイルを読み込むCGIのuploaderを作る方法を教えてください。

●質問者: garyo
●カテゴリ:インターネット ウェブ制作
✍キーワード:CGI Ruby タグ ファイル
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● backupper
●35ポイント ベストアンサー

アップロード部分を、簡単に実装してみました。細かい所は作り込んでください。

ファイルを保存する為、スクリプトと同じディレクトリにstoreというディレクトリを書き込み可で作成しておいてください。

#!/usr/bin/env ruby

require "cgi"

cgi = CGI.new("html4Tr")
if cgi.request_method == "POST"
 tmp = cgi.params['filename'][0]
 open("store/" + tmp.original_filename, "w") { |io|
 io.write(tmp.read)
 }
end

files = []
Dir.glob("store/*") do |file|
 files.push(cgi.a(file) {file})
end
file_list = files.join(cgi.br + "\n")

cgi.out do
 cgi.html("PRETTY" => " ") do
 cgi.head do
 cgi.title do "upload"; end
 end + cgi.body do
 cgi.multipart_form(cgi.script_name) do
 cgi.file_field("filename", 50) + cgi.submit
 end + file_list.to_s
 end
 end
end

下記のページが参考になります。

http://www.ruby-lang.org/ja/man/?cmd=view;name=cgi#a.a5.de.a5.eb...

◎質問者からの返答

ありがとうございます。

いまローカルPCで試しているところですが、windowsXPでwebrick1.3.1で動かした所

io.write(tmp.read)

上記の行で以下のようにエラーになりました。

||<

[2006-11-25 13:28:57] INFO WEBrick 1.3.1

[2006-11-25 13:28:57] INFO ruby 1.9.0 (2006-04-15) [i386-mswin32]

[2006-11-25 13:28:57] INFO WEBrick::HTTPServer#start: pid=3240 port=8080

[2006-11-25 13:29:13] ERROR CGIHandler: C:/ruby/server/upload.rb:

C:/ruby/server/upload.rb:9: undefined method `read' for #<CGI::QueryExtension::MorphingBody:0x2976fc4> (NoMethodError)

from C:/ruby/server/upload.rb:8

[2006-11-25 13:29:13] ERROR CGIHandler: C:/ruby/server/upload.rb exit with 1

||<


C:\ruby\server>ruby -v

ruby 1.9.0 (2006-04-15) [i386-mswin32]


2 ● furutanian
●35ポイント

Ruby 1.9 から cgi.rb の仕様が変わっているようですね。ライブラリ内のコメントによれば「[0]」を削除すれば動きそうですが。

・1.9 の snapshot 版

 204 # === Get multipart form values
 206 # require "cgi"
 207 # cgi = CGI.new
 208 # value = cgi['field_name'] # <== value string for 'field_name'
 209 # value.read # <== body of value
 214 # and value has StringIO or Tempfile class methods.

・1.6.8 添付版

 63 === GET MULTIPART FORM VALUES
 65 require "cgi"
 66 cgi = CGI.new
 67 values = cgi['field_name'] # <== array of 'field_name'
 68 values[0].read # <== body of values[0]
 73 and values[0] has StringIO or Tempfile class methods.

#私は動かしてませんし、ソースの内容も確認してませんので、ダメだったらごめんなさい。

http://www.ruby-lang.org/ja/downloads/

◎質問者からの返答

ありがとうございます。

確かにRuby1.8.5で確認すると動きました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ