IIS+CGIでmultipart/form-data送信がうまくいかない

このQ&Aのポイント
  • IIS+Perl/CGIに移行して、multipart/form-dataのファイルアップロードがうまくいかない問題が発生しています。
  • 初めてのIIS+Perl/CGIでのWEBサーバ構築で、ファイルアップロードの部分で詰まっています。
  • IIS+Perl/CGI環境でのファイルアップロードのタイムアウト問題について、解決策を教えていただきたいです。
回答を見る
  • ベストアンサー

iis+cgiでmultipart/form-data送信がうまくいかない

これまでLinux+Perl/CGIで構築していたWEBサーバをIIS+Perl/CGIに移す必要が生じ、新規にIISによるWEBサーバを構築しました。 一気にコンテンツを移動してもハマるだけだと考え、まずは簡単なコードを記述しCGIが動作するかどうかテストしています。 POSTによるinput type=textのデータ表示まではうまく行きましたが、ファイルアップロードのところで詰まりました。 IIS(Windows)によるWEBサーバの構築は初めてで、何が問題なのかサッパリわかりません。 どなたか問題点あるいはどこをチェックすれば良いかご指摘いただけませんでしょうか。 ●やった事 PerlにてPOSTを利用しmultipart/form-dataにてファイルをアップロードするシンプルなコードを書き、第一段階としてMIMEエンコードされたものをブラウザ上に表示するしようとしてみた。 コードは最下方の通り。 ●症状 送信を実行してもアップロード中のまま(ウィンドウマークが動き続けている)で、IISに設定してある10分程のタイムアウト時間を過ぎて終了してしまう。 TXT、XLS、DOCなどファイル種を変えて試しても全く同じ症状。 ●環境:Windows2000ServerSP4 IIS5.0 Perl5.8.8 *******アップロード画面****** <HTML> <HEAD> <TITILE>ファイルのアップロード</TITLE> </HEAD> <BODY> <FORM ACTION="/cgi-bin/upload.cgi" ENCTYPE="multipart/form-data" METHOD="POST"> ファイル: <INPUT TYPE="file" NAME="File" SIZE="32"><BR> <INPUT TYPE="submit" VALUE="送信"> </FORM> </BODY> </HTML> **********ここまで*********** *******CGI******************* #!/perl/bin/perl read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); print "Content-type: text/html\n"; print "\n"; print "<HTML>\n"; print "<HEAD>\n"; print "<TITLE>test</TITLE>\n"; print "</HEAD>\n"; print "<BODY BGCOLOR=\"#ffffff\">\n"; print "$buffer"; print "</BODY>\n"; print "</HTML>\n"; exit; ********ここまで***********************

  • CGI
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.1

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); を undef($/); $buffer = <>; に直してみると、どうでしょうか? うろ覚えの記憶ですが、 IIS は Content-Encoding: chunked で返すので、CONTENT_LENGTH はあてにならなかったと思います。 デコードは、マルチパートも含めて自分でやると面倒なので、 CGI.pm とかがお勧めです。

shaman2009
質問者

お礼

結論から言うと、お勧めいただいたcgi.pmを使う事にしました。 ただ、なぜうまく行かないか腑に落ちなかった事が、「IISのCONTENT_LENGTH はあてにならなかったと思います。」という一言により判りスッキリしました。ありがとうございます!! つまりは、送られてくるデータ量より大きい数字がCONTENT_LENGTHに入っているため、その分のデータが送られてくるまで待機状態になっていたという事だったんですね。試しにCONTENT_LENGTH部分を変数ではなく受け取るであろうデータ量よりも小さめの数字にしてみたところ、予想通り、受け取りデータの途中までをブラウザ上に表示できました。

関連するQ&A

  • FORMを教えてください

    全くの素人で、どなたか教えて下さい。 <HTML> <TITLE>TEST</TITLE> <BODY> <FORM ACTION="test.cgi" METHOD="POST"> 氏名<INPUT TYPE="TEXT" NAME="name"> 住所<INPUT TYPE="TEXT" NAME="tokoro"> <INPUT TYPE="Submit" value="データ送信"> <INPUT TYPE="Reset" value="リセット"> </FORM> </BODY> </HTML> 名前と住所を記入して送信ボタンを押したら記入した内容が表示されるCGIプログラムを教えて下さい。 #!/usr/local/bin/perl print "Content-Type: text/html"; print "<html>\n"; print "<head><title>TEST</title></head>\n"; print "<body>\n"; #受け取ったデータを表示する print "氏名=$in{'namae'}\n"; print "住所=$in{'tokoro'}\n"; print "</body>\n"; print "</html>\n"; exit; とした場合 氏名= 住所= しか表示されません。 何が足りないのでしょうか?

    • 締切済み
    • CGI
  • CGIでフォームからの入力内容を表示されない。

    初歩的な質問ですみません。 自宅サーバを使っています。 ■ActivePerl 5.8.8 Build 822 ■httpd142p ------------------------------ ■httpd142p ┗■cgi-bin  ┣■cgi-lib.pl  ┣■test.cgi  ┗■test.html ------------------------------- CGIは動作します。 一行目のパスもあっています。 --------------------------- 【test.cgi】 #!C:/perl/bin/perl #require './cgi-lib.pl'; #&ReadParse(*MYDATA) print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<TITLE>RESULT</TITLE>\n"; print "<BODY>\n"; print "氏名 = $MYDATA{'simei'}\n\n"; print "住所 = $MYDATA{'jyusyo'}\n"; print "</BODY>\n"; print "</HTML>\n"; exit; -------------------------------- 【test.html】 <HTML> <HEAD> <TITLE>TEST</TITLE> </HEAD> <BODY> <P> <FORM ACTION="test.cgi" METHOD="POST"> 氏名:<INPUT TYPE="text" NAME="simei"> 住所:<INPUT TYPE="text" NAME="jyusyo"> <INPUT TYPE="submit" VALUE="送信"> <INPUT TYPE="reset" VALUE="リセット"> </P> </FORM> </BODY> </HTML> ---------------------------------- ■実行結果 氏名 = 住所 = ---------------------------------- どなたかご教授ください。

    • ベストアンサー
    • CGI
  • Ajax.Updaterでmultipart/form-dataの送信方法

    <html> <body> <form action="/hoge.cgi" method="POST" enctype="multipart/form-data" target="if"> arg1:<input type="textbox" name="arg1"/><br/> <input type="file" name="data" size="60"> <input type="submit" value="Upload" onclick="post()"/> </form> <iframe name="if" id="if" frameborder="0" border="0" width="730" height="500" scrolling="yes"></iframe> </body> </html> 上記と同じような事をiframeを使わないで実現したいです。 以下の様に書いてみました。 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/html4/strict.dtd'> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="prototype.js"></script> <script type="text/javascript"> function post(){ var url ='/hoge.cgi'; new Ajax.Updater( $('result'), url, { method: 'POST', parameters: Form.serialize($("form1")), contentType: 'multipart/form-data' } ); } </script> </head> <body> <form id="form1" enctype="multipart/form-data"> arg1:<input type="textbox" name="arg1"/><br/> <input type="file" name="data" size="60"> <input type="button" value="Upload" onclick="post()"/> </form> <div id="result"></div> </body> しかし、/hoge.cgiには前者と同じようなhttpリクエストがわたりません。前者と同じような(下記(1)参照)httpリクエストを発行するにはどうしたらよいでしょうか? (1)前者:httpリクエストの例 POST /hoge.cgi HTTP/1.1 CONTENT_LENGTH: 285 CONTENT_TYPE: multipart/form-data; boundary=---------------------------7d8ea171f055c ~中略~ -----------------------------7d8ea171f055c Content-Disposition: form-data; name="arg1" -----------------------------7d8ea171f055c Content-Disposition: form-data; name="data"; filename="" Content-Type: application/octet-stream -----------------------------7d8ea171f055c-- (2)後者:httpリクエストの例 POST /hoge.cgi HTTP/1.1 CONTENT_LENGTH: 11 CONTENT_TYPE: multipart/form-data; charset=UTF-8 ~中略~ arg1=&data=

  • 標準入力からデータが読込めない

    現在perlにてcgiを作成しています。 以下のようなcgiを作成したのですが、POSTで受取ったデータが 標準入力より取得できません。 解決策、又は、調査方法等ご存知の方いらっしゃいましたら教えてください。 --------- a.cgi -------- #!/usr/bin/perl print "Content-type: text/html\n\n"; if( $ENV{'REQUEST_METHOD'} eq "POST" ){ read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); }else{ $buffer = $ENV{'QUERY_STRING' }; } print <<"HTML"; <HTML><HEAD><TITLE>テスト</TITLE> <META http-equiv=Content-Type content="text/html;"> </HEAD> <BODY> <FORM id=Form1 name=Form1 action=a.cgi method=post> HTML print <<"HTML"; <INPUT type=hidden value=aaa name=text1> <INPUT onclick="return confirm('送信します。よろしいですか?');" type=submit value=送信 name=Button1> </FORM> </BODY> </HTML> HTML exit; -------------------------------------------------- $ENV{'REQUEST_METHOD'} は POST を取得できていますし、 $ENV{'CONTENT_LENGTH'} も文字数は取得できています。 どうか宜しくお願い致します。

    • ベストアンサー
    • 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
  • PHPがHTMLのformの値を受け取らない

    状況: ファイルアップロードを作成しようとしたところPHPがHTMLのformのsubmitした物を受け取らない。 しかしHTML側にjavascriptを読み込ませ XMLHttpRequest によってsendすると受け取れる。 環境: apache 2.2.4 php 5.2.3 ------------HTML <html><body> <form action="test.php" enctype="multipart/form-data"> <input type="text" id="name"> <input type="file" id="file"> </form> </body></html> ------------PHP <?php header('Content-type: text/plain; charset=UTF-8'); print "\$_POST:";var_dump($_POST);print "\n"; print "\$_FILES:";var_dump($_FILES);print "\n"; ?> ------------結果 $_POST:array(0) { } $_FILES:array(0) { } ------------ 原因がphp.iniなのか、httpd.confなのか、はたまたそれ以外に原因があるのかがさっぱり判らず質問しました。 どうやったらHTMLのformの値をPHPで受け取れますか?

  • 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のcgiファイルを実行する手順を教えて下さい

    レンタルサーバーでperlのcgiファイルを実行する手順を教えて下さい。 レンタルサーバー会社からは、「cgi-bin」フォルダにcgiファイルを配置(アップロード)すれば ブラウザで見れると説明を受けました。 用意したcgiファイルは以下の内容です。 _____________________________ #! c:/perl64/bin/perl # CGIヘッダーの出力 print "Content-type: text/html\n\n"; #さいころを振る。 $n = int(rand 6) + 1; #HTMLの出力 print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0.1//EN\">\n"; print "<html>\n"; print "<head><title>Perlでさいころ</title></html>\n"; print "<body>"; print "<p>さいころの目は<big>$n</big>です。</p>\n"; #御言葉を出力 if($n == 4){ print "<p>ふ、不吉な・・・。4が出ました。</p>\n"; } print "<body></html>"; __________________________________________ 一行目が原因でしょうか。ローカルで作成した、cgiファイルをレンタルサーバーに配置(アップロード)し ブラウザから見たいと考えております。 ご存知の方、教えて頂けないでしょうか。 宜しくお願いします。

  • CGI勉強中(初心者です)

    #!/usr/bin/perl print "content-type:text/html\n\n"; print "<HTML>\n"; print "<head><title>CGI</title></head>\n"; print "<BODY>\n"; print "<H1><FONT COLOR=\"#FF0000\">こんにちは</FONT></H1>\n"; print "</BODY>\n"; print "</HTML>\n"; というCGIつくりました。 プロバイダの説明には Perlの場所 /usr/bin/perl または /usr/local/bin/perl となっていますが、 どこにどう置いて(ホームディレクトリでしょうか?)、どうやって起動させてよいのかさっぱりわかりません。 ご教授ください。

    • ベストアンサー
    • CGI
  • CGIで外部ファイルに書き込みができません

    Perl初心者です。 外部テキストファイルに、HTMLのフォームで入力した情報を書き込み、それを読み込んでHTMLで表示するコードをつくろうとしているのですが、外部ファイルに書き込みができません。(読み込みはできます) コードは以下のとおりです。 #! /usr/bin/perl use strict; my $self = "test.cgi"; my $str = <>; my $filename = "log.txt"; open FH,">$filename"; print FH $str; close FH; my $body; open FH,"<$filename"; my $str2 = <FH>; $body = $str2; close FH; print "Content-type: text/html\n\n"; print <<Q; <html> <head><title>jjj</title></head> <body> <form action = "$self" method = "POST"> <input type = "text" name = "data01" /> <input type = "text" name = "data02" /><br> <input type = "submit" value = "soushinn" /> <hr/> $body </form> </body> </html> Q 環境はMac OS 10.4.11、Apacheを起動して、ローカルでテストしています。 パーミッション等、いろいろ試しましたが、なぜ書き込めないのかよく分かりません。 どなたか原因を教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl