Rubyで

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/11/24 10:46:45
  • 終了:2006/11/29 10:38:30

ベストアンサー

id:backupper No.1

backupper回答回数95ベストアンサー獲得回数102006/11/24 13:00:48

ポイント35pt

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

ファイルを保存する為、スクリプトと同じディレクトリに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...

id:garyo

ありがとうございます。

いまローカル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]

2006/11/25 13:31:19

その他の回答(1件)

id:backupper No.1

backupper回答回数95ベストアンサー獲得回数102006/11/24 13:00:48ここでベストアンサー

ポイント35pt

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

ファイルを保存する為、スクリプトと同じディレクトリに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...

id:garyo

ありがとうございます。

いまローカル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]

2006/11/25 13:31:19
id:furutanian No.2

furutanian回答回数112ベストアンサー獲得回数142006/11/26 01:09:43

ポイント35pt

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/

id:garyo

ありがとうございます。

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

2006/11/27 01:13:25

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません