• ベストアンサー

Rubyでファイル転送

sakusakerZの回答

回答No.2

>undefined method `read' for "aa.jpg":String (NoMethodError) input['name'][0] は文字列(で、内容が'aa.jpg')なのでそれに readメソッドはありません。 ここでaa.jpg というファイルの内容を持って来たいのなら 読み込んでこないと。 Windows でなければ IO.read(input['name'][0]) でいいと思いますがこれだとバイナリモードとかの指定ができないので、 File.open(input['name'][0], 'rb'){|rh| rh.read} とかでしょうか。

dosparas
質問者

補足

File.open(input['name'][0], 'rb'){|rh| rh.read } により、取得を行いましたが、 No such file or directory - aa.htmlとなります。 input['name'][0]を"D:\aa.html"へ変更しても No such file or directory - D:\aa.htmlとなります。 おそらくサーバ上(linux)のD:\aa.htmlを参照していると思いますが、 これをクライアントの参照にするにはどのようにすればよろしいでしょうか?

関連するQ&A

  • if文を入れるとcgiが動きません。【Ruby】

    下記のプログラムは正常動作します。 #部、name1に文字列が入っていたら動作するプログラムを 追加すると、ブラウザが白紙になります。エラーなしです。 間違いを教えてください。このファイルはhoge.cgiです。 #!/usr/bin/ruby print "Content-type: text/html\n\n" require "cgi-lib" input = CGI.new #if name1 #print "name is ", name1 #end print <<-"EOB" <form method="POST" action="./hoge.cgi"> name<input type="text" name="name1" size="10"> <input type="submit" value="send"> </form> </body> </html> EOB

  • 任意文字の消去

    Rubyで一行チャットを作っておるのですが、 どうしてもリロードする毎にnilが画面に出てしまいます。 どうすれば、消えるのか教えてもらいませんか? cgiのコード #!/usr/local/bin/ruby print "Content-type: text/html\n\n" #html入力フォーム print <<EOF; <html> <body> <h4>チャットだお(´・ω・`)</h4> <form method="POST"> nameフォーム<input type="text" name="senddata2" size="20"><br> 本文フォーム<input type="text" name="senddata" size="80"> <input type="submit" value="送信"> </form> EOF #data.logを表示 log = "" FILENAME = "data.log" fh = open(FILENAME) fh.each{|l| log += l } fh.close print <<EOF; #{log} EOF #data.logに書き込み&リロード require "cgi-lib" input = CGI.new senddata2 = input["senddata2"] senddata = input["senddata"] fh = open(FILENAME, "a") fh.print senddata2 fh.print "> "+senddata+"<br>" fh.close print <<EOF; <meta http-equiv="refresh" content="0"> </body> </html> EOF 動かしているURL http://shu.hippy.jp/test.cgi

    • ベストアンサー
    • Ruby
  • Ruby1.8.7 ファイルアップロードCGI

    CGI を使ったファイルのアップローダを作りたくて、今日初めて Ruby を触っていますが、質問があります。 アップロードするファイル本体以外の情報を name="version" で受け取って、保存するディレクトリを分けるようにしています。書きかけのコードは以下の通りです。(タブによるインデントが入らなかったので、アンダースコアで表現しています) ----------ここからソースコード---------- #!/usr/local/bin/ruby require "cgi" begin __print "Content-Type: text/plain\n\n" __cgi = CGI.new __print "Ruby version is " __print RUBY_VERSION,"\n" __print "filename = " __print cgi['upload_file'].original_filename, "\n" __file = cgi.params['version'][0] __if file.class == StringIO then ____print "File is StringIO Class.\n" ____print "version = " ____print cgi["version"].string, "\n" ____if File.exist? cgi["version"].string then ______print "このバージョンのディレクトリは既に存在しているため、ディレクトリは作成されませんでした。" ____else ______print "ディレクトリが存在しないので作成します。" ______Dir::mkdir(cgi["version"].string, 0755) ____end ____OUTPUT_DIR = (cgi["version"].string + "/") ____open(OUTPUT_DIR + cgi['upload_file'].original_filename, "w") {|fh| ____fh.binmode ____fh.write cgi['upload_file'].read ____} __else ____print "File is TempFile Class.\n" ____#ここから先が書きかけで分からない部分です。 __end rescue => e __print "Error!" + e end ----------ここまでソースコード---------- Ruby の CGI モジュールを使っていますが、受け取ったファイルが 10240 バイト未満だと StringIOオブジェクト、10240 バイト以上だと TempFile オブジェクトになるという規則があるそうで、オブジェクトの種類によって分岐させています。 StringIO オブジェクト(10240バイト未満の送信)の場合はこれで想定通りに動いたのですが、TempFile オブジェクトと判別された場合に、 version のテキストフィールドの文字列を print により表示(出力)したりディレクトリ名にしたりする方法が分かりません。また、ファイル本体 upload_file は TempFile オブジェクトの場合でも同じ記述でファイルに保存できますでしょうか? サーバにインストールされている Ruby のバージョンは 1.8.7 です。

  • チェックボックスについて(ruby)

    cgiのプログラムでチェックボックスについてわからないことがあります。 今書いてある、プログラムだとすべての値を受け取ってしまいます。 選択されたものだけ表示させるようにさせたいと思っています。そのプログラムfor文で書いているのですが、どのように書いたらよいのでしょうか? 教えてください、お願いします! <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>プロフィール入力ページ</title> </head> <body> プロフィールを入力してください。<br> <form method="GET" action="http://profile2.cgi"> 名前: <input type="text" name="name"> <br> <br> 性別: <input type="radio" name="sex" value="男性">男 <input type="radio" name="sex" value="女性">女 <input type="radio" name="sex" value="その他">その他 <br> <br> 趣味: <input type="checkbox" name="hobby" value="映画">映画 <input type="checkbox" name="hobby" value="音楽">音楽 <input type="checkbox" name="hobby" value="スポーツ">スポーツ <input type="checkbox" name="hobby" value="料理">料理 <input type="checkbox" name="hobby" value="その他">その他 <br> <br> <br> <input type="submit" value="送信"> </form> </body> </html> #!/usr/local/bin/ruby print "Content-type: text/html; charset=euc-jp\n\n" $KCODE = "e" require "cgi" cgi = CGI.new namae = cgi["name"] sei = cgi["sex"] syumi = cgi.params["hobby"] ary = ["映画, ", "音楽, ", "スポーツ, ", "料理, ", "その他 "] str = ary[0] + " " + ary[1] + " " + ary[2] + " " + ary[3] + " " + ary[4] + " " syumi = "" for x in str syumi = syumi + x end print <<EOS <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>プロフィールの確認</title> </head> <body> 名前: #{namae} <br> <br> 性別: #{sei} <br> <br> 趣味: #{syumi} </body> </html> EOS 動作環境はruby 1.8.7 (2010-01-10 patchlevel 249) [i686-linux]になります。

    • ベストアンサー
    • CGI
  • Perlがサーバー上でうごきません

    htmlファイルには <html> <form action="form2.cgi" method="get"> 食品名1<input type="text"name="form1"> <br> 食品名2<input type="text"name="form2"> <input type="submit"value="送信"> </form> </html> cgiファイルには #! /usr/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>フォーム</title>\n"; print "</head>\n"; print "<body>\n"; print "おいしい$in{'form1'}\n; print "まずい$in{'form2'}\n; print "</body>\n"; print "</html>\n"; exit; cgi-lib.plはサーバーにいれております。 どうしてうごかないのでしょうか。

    • ベストアンサー
    • Perl
  • perlがうごきません

    htmlファイルには <html> <form action="form2.cgi" method="get"> 食品名1<input type="text"name="form1"> <br> 食品名2<input type="text"name="form2"> <input type="submit"value="送信"> </form> </html> cgiファイルには #! /usr/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>フォーム</title>\n"; print "</head>\n"; print "<body>\n"; print "おいしい$in{'form1'}\n"; print "まずい$in{'form2'}\n"; print "</body>\n"; print "</html>\n"; exit; cgi-lib.plはサーバーにいれております。 どうしてうごかないのでしょうか。 perlの場所も正確です。

    • ベストアンサー
    • Perl
  • Rubyでファイルアップローダーにリクエストを送る

    お世話になります。 プログラミング初心者、WindowsXP、Ruby 1.8.5 使用。 http://jp.rubyist.net/magazine/?0013-BundledLibraries 上記のページにある例を真似て、Webサーバ上のファイルアップローダーCGIにリクエストを出すスクリプト(のつもり)を書いてみました。以下自分で書いたコード: require 'net/http' Net::HTTP.start('www.honyara.com',80) {|http| res = http.post('/up.html/upload.cgi',"upload=C:\\test.txt") puts res.body } CGIはPerlで書かれています。これは自分で書いたものではなくてやはり他サイトのパクリなんでorz 自分ではよく理解できてません。 関係あるかどうかわかりませんがCGIのソースではファイルを取得するのにparam()を使っています。upload()ではなくて。 HTMLのCGI部分は次の通りです: <form method="post" action="upload.cgi" ENCTYPE="multipart/form-data">File Name<input type="file" name="upload" size="80"> <input type="submit" value="アップロード"> スクリプトを実行すると実際にサーバ側の指定のフォルダにtest.txtが作成されるが中身は空っぽです。もちろんアップしようとしてるファイルは中身があります。なぜ上手くいかないんでしょうか。そのヒントだけでもいただければ幸いです。

  • Ruby CGI HTTPヘッダ

    Rubyで、 CGIがクライアント(ブラウザ等)から受けたHttpリクエストヘッダとその値を全て取得して表示したいです。(どのようなヘッダが付与されても) 以下を例に教えてください。 #!/usr/bin/ruby require 'cgi' cgi = CGI.new puts "Content-Type:text/html\n\n" puts "<html>\n" puts "<body>\n" #ここにどのように書いたら良いですか? puts "</body></html>\n"

  • フォームからデータを取得してテキストファイルに保存して表示する際の質問

    CGIかなりの初心者です。 infoseek iswebでcgi-lib.plを使って、フォームからデータを取得してテキストファイルに保存してまたそのファイルから読み込んで表示するだけのプログラムを作っているのですが、アクセスするたびにテキストファイルが空になってしまいます。以下のソースなのですが、間違いを指摘していただけないでしょうか? 尚、ひとまず、フォームの項目は3つあり、そのうちの最後だけが0か1か選択でき、他は0しか選択できないようにしています。 #!/usr/bin/perl require "cgi-lib.pl"; print "Content-type: text/html;\n\n"; # 値をテキストファイルから読み込む open (IN,"test.txt"); $aaa = <IN>; close (IN); $h = substr($aaa,0,1); $i = substr($aaa,1,1); $k = substr($aaa,2,1); print " <html> <head> <title>テスト</title> </head> <body> $h$i$k <br> <form method=\"post\" action=\"test.cgi\"> データ1<br><input type=\"radio\" name=\"h\" value=\"0\" checked=\"checked\">0<br> データ2<br><input type=\"radio\" name=\"i\" value=\"0\" checked=\"checked\">0<br> データ3<br><input type=\"radio\" name=\"k\" value=\"0\" checked=\"checked\">0<br> <input type=\"radio\" name=\"k\" value=\"1\">1<br> <input type=\"submit\" value=\"送信\"> </form> "; &ReadParse(*form); # フォームの値を取得 $fh = $form{"h"}; $fi = $form{"i"}; $fk = $form{"k"}; # 値をテキストファイルに書き出す @faaa = ("$fh","$fi","$fk"); open (OUT,"> test.txt"); print OUT @faaa; close (OUT); print " </body> </html> ";

    • 締切済み
    • CGI
  • Ruby:CGI Content-Type: の設定方法

    以下に示すcgiの実行結果をContent-Type: application/x-javascriptにしたいのですが、どうしたら良いですか? #!/usr/local/bin/ruby require "cgi" cgi = CGI.new time=Time.new cgi.out do "document.write(\"#{time}\");" end