Windows2000サーバーで動いていたCGIがWindowsサーバー2003で動かない

このQ&Aのポイント
  • Windows2000サーバーでは問題なく動いていたファイルのアップロードをするCGIが、Windowsサーバー2003では正常に実行されない。
  • $filenameが''(ヌル)のままなので、ファイルのアップが動かない。
  • 誰か詳しい方に教えていただきたい。
回答を見る
  • ベストアンサー

Windows2000サーバーでは動いていたCGIがWindowsサーバー2003で動きません

ファイルのアップロードをするCGIです。 Windows2000サーバーでは問題なく動いていました。 先日Windows2003に乗り換えたとたん、動かなくなりました。 色々調べて、とりあえずエラーにはならなくなったのですが、正常に実行されないのです。 あやしいところは・・・ binmode(STDIN); while($remain){$remain-=sysread(STDIN,$buf,$remain);$read_data.=$buf;} $pos1=$pos2=$pos3=0; $delimiter=""; $max_count=0; $sendfilecnt=0; while(1){ $pos2=index($read_data,"\r\n\r\n",$pos1)+4; @headers=split("\r\n",substr($read_data,$pos1,$pos2-$pos1)); $filename=''; $name=''; foreach(@headers){ if($delimiter eq''){ $delimiter=$_; }elsif(/^Content-Disposition: ([^;]*); name="([^;]*)"; filename="([^;]*)"/i){ if($3){ $filename=$3; if($filename=~/([^\\\/]+$)/){$filename=$1;} } }elsif(/^Content-Disposition: ([^;]*); name="([^;]*)"/i){$name=$2;} } このへんです。 どうも、$filenameが''(ヌル)のままなので、この後正常にファイルのアップが動かないようなのです。 どなたか詳しい方、ぜひ教えてください。

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

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

  • ベストアンサー
  • arcsin
  • ベストアンサー率70% (28/40)
回答No.2

#1です。 微妙に間違えました。失礼! Content-Disposition:.*? name="([^;]*)"; filename="([^;]*)" ですね。ちょっと試してみてください。ちなみに、()1つなくしちゃったので、1つずれて、$2は$1、$3とかは $2になりますよね。それがめんどうなら、 Content-Disposition:(.*?) name="([^;]*)"; filename="([^;]*)" でもいいとおもいます。これなら他の変更は不要!

その他の回答 (1)

  • arcsin
  • ベストアンサー率70% (28/40)
回答No.1

まったくもって自信はありませんが、 Content-Disposition: ([^;]*); name="([^;]*)"; filename="([^;]*) を、 Content-Disposition:([^;]*); name="([^;]*)"; filename="([^;]*) にするとどうでしょう。 (Content-Disposition:の後ろの半角スペースを削除した) 一般的に、この $1 にあたる部分には form-data がくると思うのですが、cgi-lib.pl のソースを見ていたところ、それについての処理が書いてありませんでした。 滅茶苦茶適当な解釈ですが、これは「稀に form-data と言う文字列をはかない場合がある得るかもしれないから書いてい無い」と強引に考えちゃえば、もしこれが無い場合、nameの前に半角スペースが2つあることになりますよね。それで正規表現にひっかからないとか。 見た感じ、}が1つたりないですが処理の方向としては間違ってないと思うので、一度、$read_data の中身をブラウザ上に表示して確かめてはどうでしょう。

himahima_san
質問者

お礼

ご回答、ありがとうございます。 実は、今日、解決したのです。 Windows server2003では、ファイルの参照などに相対参照が使えず、絶対参照を使わなければなりませんでした。 そこで、ファイルのアップロード先に、ルートからのパスをすべて記述する事で解消したのです。 取り下げるのが遅れたので、お騒がせしました。 ご回答、本当にありがとうございました。

関連するQ&A

  • とほほさんのファイルのアップロードのことで

    http://tohoho.wakusei.ne.jp/wwwxx034.htm のファイルのアップローダーを使用しています。 私は普段postのデータを受け取るのに、 read(STDIN,$buffer,$ENV{'content_length'}); のように指定していますが、ここでは $buf = ""; $read_data = ""; $remain = $ENV{'CONTENT_LENGTH'}; binmode(STDIN); while ($remain) { $remain -= sysread(STDIN, $buf, $remain); $read_data .= $buf; } としているみたいです。 ファイルをアップロードするだけなら上記をそのまま使用すればいいのですが、 ファイル名とともに取得したいデータをファイルアップロードの画面でユーザーに指定してもらうので、 そのデータをどのように取得すればいいのかわかりません。 このとほほさんが書いたコードはどのようにデータを受信しているのでしょうか? おわかりの方ご説明お願いします。

    • ベストアンサー
    • Perl
  • 正規表現。たぶん単純な質問です。

    とほほさんのフリーソフト、wwwupl.cgiを解読中なのですが、そこに、 elsif(/^Content-Disposition: ([^;]*); name="([^;]*)"; filename="([^;]*)"/i){…} このelsifの中の/ /iのiは何を意味しているのでしょうか。

    • ベストアンサー
    • CGI
  • CGI経由でのPDFファイルをダウンロード

    こんにちは。 CGIの初心者です。 今CGI経由でのPDFファイルをダウンロードするというプログラムを作っています。 ただ、ダウンロードしたファイルは開けなく、エラーが出ます。ファイルを確認すると0バイトです。原因はよく分からないので、誰かが教えてください。ありがとうございます。 コードです: $filename = './data/sheet.pdf'; $source = $filename ; print qq|Content-type: text/plain\n|; print qq|Content-Disposition: attachment; filename="$filename"\n|; print qq|\n|; #-- ファイルを読み込んで出力 open(FILE,"$source"); binmode FILE; binmode STDOUT; while(read(FILE, $value, 4096)){ print $value; } close FILE;

    • 締切済み
    • CGI
  • htmlで呼び出したCGIの出力が文字化けする

    下記のInput.cgiというスクリプト(改行コードLF, 文字コードUTF-8) ---------------- #! /usr/bin/perl $method = $ENV{'REQUEST_METHOD'}; if ($method eq 'POST') { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } elsif ($method eq 'GET') { $buf = $ENV{'QUERY_STRING'}; } print "content-type: text/html\n\n"; print "メソッドは$methodでした。<br>\n"; print "受け取ったデータは$bufでした。\n"; ---------------- があります。これをブラウザで見ると(入力なしのまま) 「メソッドはPOSTでした。  受け取ったデータはxxxでした」 と正常に表示されます。 次に次の内容のhtml(改行はLF,文字コードはShiftJIS) ------------- <html><head> <title>FORMによるデータ転送</title></head> <body> <form method="POST" action="myInput.cgi"> <input type="text" name="text"><br> <input type=submit value="送信"> <input type=reset value="取消"> </form></body></html> -------------- をブラウザで表示させ、inputボックスに英数字(または日本語)を入力し、「送信」をクリックすると、今度はCGIスクリプト中の日本語を含めて総ての日本語出力が文字化けしてしまいます。 これが起きるのは、htmlとCGIの文字コードが異なるからでしょうか? 文字化けを止めるには何をすればよいのでしょうか? 教えて下さい。お願いいたします。

  • CGIで二つの仕事をしたい

    464487で質問したOtanoshikeです。 メール送信CGIは_mer_さんに教えて頂いたように直したら、無事動くようになりました。 今度は、このCGIの中で、メール送信後にファイル転送をしようとしています。 一応動いてはいるようなのですが、最後の確認ページが出ません。 どこが悪いのでしょうか?恐らくはまた基本的なことを無視しているのでしょうね。 よろしくお願いいたします。 (a.cgi) #!/usr/bin/perl require '../mimew.pl'; require '../jcode.pl'; $sendmail = "/var/qmail/bin/sendmail"; $master_id = "ho\@hoge.net"; $msg="メッセージ"; &jcode'convert(*msg,'jis'); open (ML,"| $sendmail $master_id"); print ML $msg; close(ML); $filename=$ARGV[0]; $file="/~/~/$filename"; $filetype='x-exe'; print "Content-Disposition:attachment;filename=\"$filename\"\n"; print "Content-type:application/$filetype\n\n"; open(FILE,"$file"); while(<FILE>){ print "$_"; } close FILE; print "Content-type: text/html\n\n"; print "<html><head>\n"; print "</head>\n"; print "<body>sent.\n"; print "</body></html>\n"; exit;

    • ベストアンサー
    • CGI
  • Perlで画像のサイズ取得する方法

    URL指定で画像サイズの取得が出来ません。 何方かご教授お願いします。 悲しいことにレンタルサーバーにはimage::magickがインストールされていないので使えません。 ----perl---- #!/usr/bin/perl $FileName = "http://i.yimg.jp/images/main11.gif"; ( $format, $width, $height ) = &GetImageSize( $FileName ); print "Content-type: text/html\n\n"; print <<"HTML"; <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <BR> $width x $height <br> <IMG src="$FileName" border="0"> HTML sub GetImageSize{ my ( $IMG, $in ) = @_; my ( %SHT, %LNG ); my ( $buf, $mark, $type, $f_size, $width, $height ); my ( $TAG, $TYPE, $COUNT, $V_OFFSET, $PK, $ENTRY, $Exif_IFD ); my ( $endian, $dummy1, $dummy2, $dummy, $EOI, $APP1, $length, $exif ); my ( $format, $offset, $line, $CODE, $jfif ); my @TGA; my $ntag; # 定数 $mark = pack("C", 0xff); %SHT = ( 'II' => 'v', 'MM' => 'n' ); %LNG = ( 'II' => 'V', 'MM' => 'N' ); # 初期値 $endian = ''; $width = -1; $height = -1; $format = ''; $Exif_IFD = -1; if( $in eq '' ){ $in = 'IMG'; } open( $in, $IMG ) || return( '', -1, -1 ); binmode($in); seek( $in, 0, 0 ); read( $in, $buf, 6 ); # GIF 形式 if($buf =~ /^GIF/i){ $format = 'GIF'; read( $in, $buf, 2 ); $width = unpack("v*", $buf); read( $in, $buf, 2); $height = unpack("v*", $buf); } close( $in ); return( $format, $width, $height ); } exit;

    • ベストアンサー
    • Perl
  • アルゴリズム・ネストループ方式って何?

    プログラムの性能改善の課題が出ているのですが、アルゴリズムとしてネストループ方式、もしくはその延長上のものを用いること、とあります。 図書館でアルゴリズム関係の本を見てみたのですがどこにもネストループに関して説明がなく、大変困っています。 プログラム自体は、ファイルを読み込んで、表示させるだけの簡単なものです。 簡単に抜き出すと、 for (i=0;; i++){ if ((st = read_a(fd_name, &name_buf, i)) <=0) break; for (j = 0;; j++){ if ((st =read_a (fd_home,&home_buf ,j)) <= 0) break; if (!strcmp(name_buf.a , home_buf.b)){ printf("%s =%s (%s)\n", name_buf.a, name_buf.c , home_buf.c); } } if (st <0) break; といったものです。 注意事項として、break文を入れる手法を使わないこととあります。 お願いします。ネストループって何でしょう?教えてください。

  • エクセルファイル 行列入れ替えたもの同時作成VBA

    あるxmlファイルを一旦テキストファイルにして そこから数値をエクセルファイルに移行して ひとつはM.xlsxとし それに続いて行列を入れ替えた エクセルファイルR.xlsxを 作りたいのですが M.xlsx R.xlsxのそれぞれを作るコードを 単純に 合体させただけでは どうも できません M.xlsxだけ また R.xlsxだけの 作成するコードは 出来たのですが それぞれ別のマクロとして実行することになります ひとつのマクロでM.xlsx R.xlsx同時に 作成するVBAコードは可能でしょうか 宜しくお願い致します ちなみに該当コードを単純化して 合体したのが以下のものです win10 office10 Sub 783縦() Dim FileName As Variant ChDir "\\DESKTOP-O5\f" FileName = Application.GetOpenFilename(FileFilter:="xmlファイル,*.xml") If FileName = False Then MsgBox "キャンセルされました" Exit Sub End If FileCopy FileName, Left(FileName, InStrRev(FileName, "\")) & "テキスト.txt" Const MyFile = "\\DESKTOP-O5\f\テキスト.txt" Const Key1 = "<Name>" Const Key2 = "</Name>" Const Key3 = "<NameKana>" Const Key4 = "</NameKana>" Const PutBokName = "M.xlsx" Dim buf As String Dim Len1 As Long Dim Len2 As Long Dim Pos1 As Long Dim Pos2 As Long Dim Len3 As Long Dim Len4 As Long Dim Pos3 As Long Dim Pos4 As Long Dim PutBook As Workbook With CreateObject("ADODB.Stream") .Charset = "UTF-8" .Open .LoadFromFile MyFile buf = .ReadText .Close End With Len1 = Len(Key1) Len2 = Len(Key2) Pos1 = InStr(buf, Key1) Pos2 = InStr(buf, Key2) Len3 = Len(Key3) Len4 = Len(Key4) Pos3 = InStr(buf, Key3) Pos4 = InStr(buf, Key4) Set PutBook = Workbooks.Add With PutBook.Sheets(1) .Cells(1, 1).Value = "氏名" .Cells(1, 2).Value = Mid(buf, Pos1 + Len1, Pos2 - (Pos1 + Len1)) .Cells(2, 1).Value = "氏名カナ" .Cells(2, 2).Value = Mid(buf, Pos3 + Len3, Pos4 - (Pos3 + Len3)) 'クリップボードをクリア Application.CutCopyMode = False PutBook.SaveAs ThisWorkbook.Path & "\" & PutBokName End With Const PutBokName = "R.xlsx" Dim buf As String Dim Len1 As Long Dim Len2 As Long Dim Pos1 As Long Dim Pos2 As Long Dim Len3 As Long Dim Len4 As Long Dim Pos3 As Long Dim Pos4 As Long Dim PutBook As Workbook With CreateObject("ADODB.Stream") .Charset = "UTF-8" .Open .LoadFromFile MyFile buf = .ReadText .Close End With Len1 = Len(Key1) Len2 = Len(Key2) Pos1 = InStr(buf, Key1) Pos2 = InStr(buf, Key2) Len3 = Len(Key3) Len4 = Len(Key4) Pos3 = InStr(buf, Key3) Pos4 = InStr(buf, Key4) Set PutBook = Workbooks.Add With PutBook.Sheets(1) .Cells(1, 1).Value = "氏名" .Cells(2, 1).Value = Mid(buf, Pos1 + Len1, Pos2 - (Pos1 + Len1)) .Cells(1, 2).Value = "氏名カナ" .Cells(2, 2).Value = Mid(buf, Pos3 + Len3, Pos4 - (Pos3 + Len3)) 'クリップボードをクリア Application.CutCopyMode = False PutBook.SaveAs ThisWorkbook.Path & "\" & PutBokName End With End Sub -------------------------------

  • CGIでhtmlページを表示する

    連日質問させていただいています。 CGI超初心者です。 htmlファイルにラジオボタンを設置し、 Aを選んだらhttp://www.a.html、 それ以外を選んだらhttp://www.b.html というサイトを開くようなCGIを作成したいです。 以下のようにやってみたのですがうまくいきません。 どのように修正したらいいでしょうか? #============================================ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $str, $ENV{'CONTENT_LENGTH'}); } else { $str = $ENV{'QUERY_STRING'}; } foreach $i (split('&', $str)) { $i =~ tr/+/ /; $i =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; ($t1, $t2) = split('=', $i); $FORM{"$t1"} = $t2; } $q1 = $FORM{'radio'}; print "Content-Type: text/html; charset=Shift_JIS\n\n"; print "<html>\n"; print "<head></head>\n"; print "<body>\n"; if ($q1 eq "A") { print "Location: http://www.a.html\n\n"; } else { print "Location: http://www.b.html\n\n"; } print "</body>\n"; print "</html>\n"; exit; #============================================ 上記のようにすると、以下のように、ただ文字が表示されてしまいます。 Location: http://www.a.html #============================================ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $str, $ENV{'CONTENT_LENGTH'}); } else { $str = $ENV{'QUERY_STRING'}; } foreach $i (split('&', $str)) { $i =~ tr/+/ /; $i =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; ($t1, $t2) = split('=', $i); $FORM{"$t1"} = $t2; } $q1 = $FORM{'radio'}; print "charset=Shift_JIS\n\n";←★ print "<html>\n"; print "<head></head>\n"; print "<body>\n"; if ($q1 eq "A") { print "Location: http://www.a.html\n\n"; } else { print "Location: http://www.b.html\n\n"; } print "</body>\n"; print "</html>\n"; exit; #============================================ ★部分が悪いのかなぁと思い、上記のように修正してみたり、 (Content-Type: text/html; を削除してみました) ★部分を全部削除してみると Internal Server Error となってしまいます。 よろしくお願いいたします!

    • ベストアンサー
    • CGI
  • PerlのソースをPHPに移植中なのですが...

    下記のようなperlをPHPに移植しようと考えています open( FHDR, "<$filename") || return; binmode( FHDR); if ( read( FHDR, $buf, 2) != 2 ) { close(FHDR); return;} if ( 0xffd8 != unpack("n", $buf)) { close(FHDR); return;} if ( read( FHDR, $buf, 10) != 10 ) { close(FHDR); return;} ( $marker,$size,$ext) = unpack("nna6",$buf); ...続く このなかでの最後の行 unpack()がさっぱりわからず 特に"nna6"が何を意味するのかわかりません。 PHPにもunpack()がありますが、やはり意味が解りません。 Perlとも少し動きが違うような... どなたか unpack("nna6",$buf) の意味、 "nna6" の意味、 そしてPHPに移植する場合どう書くのか? 教えてください! よろしくお願い致します!

    • ベストアンサー
    • Perl

専門家に質問してみよう