- - PR -
ファイルアップロードCGI が Windows server 2003 で動かないのは?
| 投稿者 | 投稿内容 | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-04-05 01:58
どもでふ。がるです。
まず一点。
ものすごく念のために、
とかやってみてください。 …とはいってもこれで通ったら通ったで「./つけてないときはどこに ファイル書いてるんだろう??」とは思いますが :-P
とりあえず順番が逆ですね(苦笑
こうしないと「代入する前に出力」してしまうので。 上記のとおりに直して、もう一度動かしてみてください。
いあ。途中まで動いている以上「CGIそのものが動かない」ことはないですね。
まぁ大変だとは思いますが(苦笑 とりあえず今日はしっかりと寝て、少しリラックスすると楽ですよ ^^ [/quote] | ||||||||||||||||||||||||
|
投稿日時: 2005-04-05 07:50
独自コントロールパネルを使ってる場合、そのレンタルサーバ業者に聞かないと分かりません。 その設定で正しいのか、問題が無いのか、そのコントロールパネルの機能を知らないと 答えられるわけもありませんから。 | ||||||||||||||||||||||||
|
投稿日時: 2005-04-05 10:25
ファイルが、
C:\Inetpub\wwwroot (ルートディレクトリ)に 作られているということはないでしょうか? | ||||||||||||||||||||||||
|
投稿日時: 2005-04-05 12:12
お世話になります!
がるさん、すいません。本当ですね、逆です。 これじゃいつまでたってもヌルしか表示されないはず・・・。 順番を入れ替えたところ、$filenameには、ちゃんとファイルネームが入っていました! そこでトラップを増やしてみる事に。 問題の箇所です。 if($filename && $flcheck){ print "flcheck2 = $flcheck\n"; print "filename2 = $filename\n"; if(open(FH,">$Cuploaddir/$filename$Cappendext")){ binmode FH; こうすると、 flcheck2 = 1 flname2 = test.jpg と表示されるのですが、 if($filename && $flcheck){ if(open(FH,">$Cuploaddir/$filename$Cappendext")){ print "flcheck2 = $flcheck\n"; print "filename2 = $filename\n"; binmode FH; こうすると、何も表示されません。 ということは、 open(FH,">$Cuploaddir/$filename$Cappendext") が通っていないということになります。そこで、 if($filename && $flcheck){ print "Cuploaddir = $Cuploaddir\n"; print "filename = $filename\n"; print "Cappendext = $Cappendext\n"; if(open(FH,">$Cuploaddir/$filename$Cappendext")){ としてみると、 Cuploaddir = ./db/images/s02 filename = test.jpg Cappendext = となりましたので、変数を代入するとここのif文は if(open(FH,">./db/images/s02/test.jpg")){ となっています。 ということは、 open(FH,">./db/images/s02/test.jpg") が、真になっていない・・・ということは、 ファイルのオープンに失敗しているということですね。 なぜ???? そこで、Windows server2003ではファイルの指定は絶対パスでしなければならない、 と教えてもらったことを思い出し、 if(open(FH,"> ./test_com/Cgi-bin/db/images/s02/test.jpg")){ とか、 if(open(FH,"> c:/test_com/Cgi-bin/db/images/s02/test.jpg")){ とかにしてみることに。 その上、ファイルのアップロード先も $Cuploaddir='./XXXX.com/www/Cgi-bin/db/images/s02'; # アップロードファイルを格納するディレクトリ とか、 $Cuploaddir='./Cgi-bin/db/images/s02'; とかにしてみました。 ちなみに、 ./XXXX.com/www/Cgi-bin/db/images/s02 というのは、 FTPソフト(FFFTP)で上に表示されるパスをコピーしたものです。 上記の方法、すべてだめでした・・・。 ----------------------------------------------------------------------------- そして、がるさん、なか-chanさんに教えてもらったとおり、前回のテスト #!/usr/bin/perl open (IN, "> ./test.txt"); print IN "なんかまぁ適宜"; close IN; print "Content-type: text\/plain\n\n"; print "できたかな?"; でもやってみて、ルートを探したところ・・・ ありました!ルートに。 ということは、少なくともルートには書き込みができるということですね。 ということは、やはりファイルのパスあたりがあやしいのでしょうか???? 大分確信に近づいてきたような気がします。(全然検討外れだったりして) 何か案があれば教えてください。 となり、Cappendextがヌルだということがわかりました。 | ||||||||||||||||||||||||
|
投稿日時: 2005-04-05 12:14
すいません。
上記の書き込み、最後の行 ”となり、Cappendextがヌルだということがわかりました” は余分です。 | ||||||||||||||||||||||||
|
投稿日時: 2005-04-05 13:19
で、で、できましたぁぁぁぁ〜〜〜〜〜!!!!
ありがとうございました! どうやってたどり着いたかというと、 まず、あの”がる”さんに教えてもらった、黄金のテストコードをいろいろやってみることにしたんです。 (今私の中では、黄金のテストコードになっています) ----------------------------------------------------- #!/usr/bin/perl open (IN, "> test.txt"); print IN "なんかまぁ適宜"; close IN; print "Content-type: text\/plain\n\n"; print "できたかな?"; ------------------------------------------- これです。 これが、なか-chanさんのおっしゃるとおり、ルートにできていたので、 本当に書き込みが可能なのかを調べようと、 ちょっとずつフォルダの階層にはいっていったんです。 ./cgi-bin/test.txt ./cgi-bin/db/test.txt ./cgi-bin/db/images/test.txt ./cgi-bin/db/images/02/test.txt という風に。 すべて書き込みができました。 ということは、現在どのユーザでアクセスしているかは未だに分かりませんが、 とにかく書き込み可能だということがわかったのです。 ということは、やはりWindows server2003 では、相対パスではなく、絶対パスなんだということが私にもわかってきたのです。 そこで、 問題のコードの $Cuploaddir=./nattokudb/images/s02'; # アップロードファイルを格納するディレクトリ この部分を $Cuploaddir='./cgi-bin/nattokudb/images/s02'; に変えたら、アップロードできました! たった、7文字のことで1週間以上も・・・・。 でも、問題解決ができて本当に助かりました。 とにもかくにも、最初は、 このフォルダには書き込みできないんじゃないか? それともcgiがWindows対応じゃないんじゃないか? など、油の中を泳いでいる状態から、 ”こっちやで〜〜” と迷走する私を導いてくださり、本当に皆さんお世話になりました。 これで少しはスキルがあがったような気がします。 ありがとうございました!! 苦労してよかったです! Mattunさん、がるさん、なか-chanさん、ありがとうございました! 実は、もうひとつ、これも長い間つまっていることがありますので、 また別のスレッドを立てさせていただきます。(すいません、調子に乗ってます) もし、もし、もし、よかったら見に来てください。 Windows server2003で自動送信メールが送れないという案件です。 最後に、本当に皆さんありがとうございました! | ||||||||||||||||||||||||
|
投稿日時: 2005-04-05 13:33
himahima_sanさんこんにちは。
IISの場合、カレントディレクトリがデフォルトでは ルートになった気がします。ですので、1行目に chdir(絶対パス指定)を書いて、現在のディレクトリに 移動してあげると、以降はそのまま使えたと思います。 chdir("c:\\test_com\\Cgi-bin"); とやって、 open (IN, "> ./test.txt"); にすると、 c:\test_com\cgi-bin\test.txt が出来ると思います。 | ||||||||||||||||||||||||
|
投稿日時: 2005-04-05 14:19
なか-chanさん、できました!
私の場合、レンタルサーバーなので、 chdir("./cgi-bin/nattokudb/images/s02") と記述したら、すんなりできました。 最初にchdirすれば、その後は相対参照でできるんですね。 そこで、ファイルアップロード用コードにもこれを付け加えてみました。 これもOKでした。 こうしておけば、いちいち絶対パスを記述しなくても大丈夫ですね。 分かりやすいし。 動かなくなったアクセスカウンタもこれが原因のような気がしてきました。 早速試してみます! ありがとうございました。 | ||||||||||||||||||||||||
