- PR -

ファイルアップロードCGI が Windows server 2003 で動かないのは?

投稿者投稿内容
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-04-05 01:58
どもでふ。がるです。
まず一点。

コード:
open (IN, "> test.txt");


ものすごく念のために、
コード:
open (IN, "> ./test.txt");


とかやってみてください。
…とはいってもこれで通ったら通ったで「./つけてないときはどこに
ファイル書いてるんだろう??」とは思いますが :-P


引用:

教えていただいたとおりトラップを仕掛けて調べたところ、
if($3){
  print "$filenameファイルネーム";
  $filename=$3;
  if($filename=~/([^\/]+$)/){$filename=$1;}
}
としておいたら、
やはり$filenameはヌルでした。


とりあえず順番が逆ですね(苦笑
コード:
if(){
  $filename=;
  print "$filenameファイルネーム";
  if($filename=~/([^\/]+$)/){$filename=;}
}


こうしないと「代入する前に出力」してしまうので。
上記のとおりに直して、もう一度動かしてみてください。

引用:

ということは、書き込みが禁止である上に、このCGIはこのサーバーでは動かない
ということでしょうか。


いあ。途中まで動いている以上「CGIそのものが動かない」ことはないですね。

引用:

もう、私の手にはおえそうにありません。
Windows server2003恐るべし・・・


まぁ大変だとは思いますが(苦笑

とりあえず今日はしっかりと寝て、少しリラックスすると楽ですよ ^^
[/quote]
Mattun
ぬし
会議室デビュー日: 2004/08/10
投稿数: 1391
投稿日時: 2005-04-05 07:50
引用:

とありますが、レンタルサーバーの場合、どうすればいいでしょうか。
とりあえず、レンタルサーバーのコントロールパネルをもう一回見直してみました。


独自コントロールパネルを使ってる場合、そのレンタルサーバ業者に聞かないと分かりません。
その設定で正しいのか、問題が無いのか、そのコントロールパネルの機能を知らないと
答えられるわけもありませんから。
なか-chan@最愛のiMac
ぬし
会議室デビュー日: 2002/07/17
投稿数: 385
お住まい・勤務地: 和光市・世田谷区
投稿日時: 2005-04-05 10:25
ファイルが、
C:\Inetpub\wwwroot
(ルートディレクトリ)に
作られているということはないでしょうか?
himahima_san
会議室デビュー日: 2005/04/03
投稿数: 12
投稿日時: 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がヌルだということがわかりました。
himahima_san
会議室デビュー日: 2005/04/03
投稿数: 12
投稿日時: 2005-04-05 12:14
すいません。
上記の書き込み、最後の行

”となり、Cappendextがヌルだということがわかりました”

は余分です。



himahima_san
会議室デビュー日: 2005/04/03
投稿数: 12
投稿日時: 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で自動送信メールが送れないという案件です。


最後に、本当に皆さんありがとうございました!
なか-chan@最愛のiMac
ぬし
会議室デビュー日: 2002/07/17
投稿数: 385
お住まい・勤務地: 和光市・世田谷区
投稿日時: 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
が出来ると思います。

himahima_san
会議室デビュー日: 2005/04/03
投稿数: 12
投稿日時: 2005-04-05 14:19
なか-chanさん、できました!
私の場合、レンタルサーバーなので、

chdir("./cgi-bin/nattokudb/images/s02")

と記述したら、すんなりできました。
最初にchdirすれば、その後は相対参照でできるんですね。

そこで、ファイルアップロード用コードにもこれを付け加えてみました。
これもOKでした。
こうしておけば、いちいち絶対パスを記述しなくても大丈夫ですね。
分かりやすいし。

動かなくなったアクセスカウンタもこれが原因のような気がしてきました。
早速試してみます!

ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)