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

RubyでHTTPのPostを使用してファイルをアップロードするスクリプトを作りたいです。試しにコメント欄のような物を作ってみましたが、500でエラーが発生してしまいます。

request["content-type"] = "multipart/form-data, boundary=#{boundary}"
の末尾に改行(\r\n)を入れるとエラーは発生しませんが、データとして認識してくれません。つまり、CGIのデータとして入ってきません。

有力な回答をして頂いた方に優先的にポイントをプレゼント致します。

●質問者: ichiroc
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:CGI HTTP Ruby アップロード エラー
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● るびきち
●100ポイント ベストアンサー

httpclient(gem install httpclient)を使うと楽です。

require 'rubygems'
require 'httpclient'

boundary = "123456"
c = HTTPClient.new
open("/r/hoge.txt") do |file|
 postdata = { "first_name" => "michael", "last_name" => "jackson",
 "file" => file }
 puts c.post_content("http://localhost:9998/hoge.cgi", postdata,
 "content-type" => "multipart/form-data, boundary=#{boundary}")
end

動作確認のCGIスクリプトはこんなの。

#!/usr/local/bin/ruby
require 'cgi'
cgi = CGI.new
cgi.out("type"=>"text/plain") {
 cgi["file"].read
}

http://d.hatena.ne.jp/rubikitch/20080627/1214504190

◎質問者からの返答

ありがとうございます!!

動作確認できました!!


2 ● poch-7003
●10ポイント

こんな感じでしょうか。

contents.txt

1.hoge
2.hogehoge
3.hogehogehoge
4.hogehogehogehoge

upload.cgi

#!/usr/bin/ruby
# vim:set ts=2 sw=2 sts=2 si ai nu et ft=ruby:
#
# [upload.cgi]
#

require "cgi"

cgi = CGI::new
files = cgi["file1"]

print "Content-type: text/html\r\n\r\n"
puts "filename: " + files.original_filename
puts "----------------"
puts files.read
puts "----------------"

exit(0)

post.cgi

#!/usr/bin/ruby
# vim:set ts=2 sw=2 sts=2 si ai nu et ft=ruby:
#
# [post.cgi]
#

require 'net/http'

boundary='-----------------------3948A8'
contents = File::open("./contents.txt").read

data = %[--#{boundary}] + "\r\n"
data << %[Content-Disposition: form-data; name="file1"; filename="contents.txt"] + "\r\n"
data << %[Content-Type: text/plain] + "\r\n\r\n"

data << contents
data << %[\r\n--#{boundary}--\r\n]

header ={
 'Content-Length' => data.length.to_s,
 'Content-Type' => "multipart/form-data; boundary=#{boundary}"
}

Net::HTTP.start('localhost', 80) do |http|
 r= http.post('/~hoge/cgi-bin/upload.cgi', data, header)
 print r.body
end

exit(0)
関連質問


●質問をもっと探す●



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