• ベストアンサー

statの戻り値が返ってこない

CGIでファイルアップをするために次の構文を入れて容量をチェックしようと思いました。 $size = (stat("$file"))[7]; しかし$sizeには何も数値が返ってきません。 それでも$fileのファイルはアップできています。 サーバー会社に聞いても普通に使えると言いますし、同一の構文を他社サーバーで利用しています。 @size = stat("$file");や @size = stat $file;で $size[7]の数値をとるやり方でやっても結果は同じく何も返ってこずnullです。 6など違うインデックスを入れてみても同じ結果です。 この場合何が問題の可能性があるのでしょうか。 ファイルそのものはアップできていますが、容量制限やサイズによっての振り分けなどができず困っています。 誰かご存じの方ご教授ください。 よろしくお願いします。

  • choei
  • お礼率63% (286/451)
  • CGI
  • 回答数5
  • ありがとう数1

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

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.5

> どういうプログラムを組めばクライアントPCでリストを作成し、サーバに送れるのでしょうか。 > 何か参考になるURLなどご存じないでしょうか。 適当な URL は知らないのですが、次のようになるかと思います。 1)手作業でリストファイルを作成するのも1方法です。エディタで作成する、dir (DOS 系)  または ls (Unix 系) の出力を編集する、といった方法があります。また、Perl はこの  分野も得意ですので、プログラムで自動化することもできます。 2)リストファイルをサーバーに送るのは、CGI ファイルを送ったのと同じ方法が使えるで  しょう。その際、リストファイルの文字コードをサーバーの文字コードと合わせておき  ます。リストファイルが ASCII コードのみで、FTP のアスキーモードで転送する場合は、  (たぶん) FTP が改行文字を変換してくれるので大丈夫でしょう。 3)CGI をリストファイルを見ながら処理を進めるように修正する。 なお、容量制限には対応できませんが、振り分けだけならばいったんサーバーに受け取って、 その後振り分けるという処理が、CGI でできます。こっちの方が、簡単かもしれません。 どのみち容量オーバーのファイルは、そのままでは送ることができないので、除外しておけ ばよいと思います。

choei
質問者

お礼

ありがとうございました。 ちょっと時間がかかりそうですが何とかやってみます。 ありがとうございました

その他の回答 (4)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

> 他社サーバーではこれで十分アップされるファイルが事前に確認できていたので、これでいいと思っていたのですが、今のサーバーがそういう仕様になっていないということでしょうか。 stat は os のシステムコールを利用してファイル情報を取得しているので、 os の管理外であるクライアントのパソコンからファイル情報を取得することは できないはずです。他社サーバーで使っていたコードは、今回のコードとは 少し違っているのではないかと思うのですが? > その場合、Perlスクリプトでアップしようとしているファイルのファイルサイズを確認することは無理なのでしょうか。 具体的な処理がわからないので答えにくいのですが、クライアントのパソコンで アップするファイルのリストを作成して、それをサーバーに渡してはどうでしょ うか。リストをファイルにすれば、FTP で送ることもできますし、CGI からも取 得できると思います。

choei
質問者

補足

返信ありがとうございます。 >他社サーバーで使っていたコードは、今回のコードとは >少し違っているのではないかと思うのですが? 全く同じです。そのままコピペしたので。 >クライアントのパソコンでアップするファイルのリストを作成して、 >それをサーバーに渡してはどうでしょうか。 知識不足ですみません。 どういうプログラムを組めばクライアントPCでリストを作成し、サーバに遅れるのでしょうか。 それをなんと呼ぶのかすら分からないので、ネットでも探せず困っております。 何か参考になるURLなどご存じないでしょうか。

回答No.3

> statや-eはファイルがサーバー上に存在する必要があるという前提の構文なのでしょうか。 はい、そうですよ。大抵はファイルのinodeを見る実装になっていると思います。 > アップロードする途中でそのファイルのサイズをチェックしてアップするかしないかを判断する 恐らく、前に試された方法では、サーバ上にtempファイルができてそのPATHを受け取っていたんでしょう。

choei
質問者

補足

何度もご返答頂きありがとうございます。 >>statや-eはファイルがサーバー上に存在する必要があるという前提の構文なのでしょうか。 >はい、そうですよ。 そうだったのですか。 他社サーバーではこれで十分アップされるファイルが事前に確認できていたので、これでいいと思っていたのですが、今のサーバーがそういう使用になっていないということでしょうか。 その場合、Perlスクリプトでアップしようとしているファイルのファイルサイズを確認することは無理なのでしょうか。 何か他の方法またはスクリプトで確認することってできないのでしょうか。

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

少し疑問があるのですが、 > というよりそのあとの行でアップロードができてますし・・・ のように書かれていますが、stat や -s を実行する時点で、サーバーにファイルが 存在する必要があるのではないでしょうか。ファイルの実体がない段階で stat を実行しているような感じがするのですが?

choei
質問者

補足

うまく言えないのですが、 ファイルの実態がないとだめなのですか? アップロードする途中でそのファイルのサイズをチェックしてアップするかしないかを判断する・・・という使い方を他のサーバーではしていたので、その部分を流用したのですが。 サーバー上にファイルの実態がないときに利用できないのであれば、もちろん意味ないですよね? ただ私としてはアップする前の段階として送られてきたファイルの容量を確認してどうするかを分岐させたいのです。 statや-eはファイルがサーバー上に存在する必要があるという前提の構文なのでしょうか。

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

詳しいことはわかりませんが、stat はシステムに依存しているように思います。 Unix のシステムでは、間違いなくうまく動くのでしょうが。 サイズが必要なだけならば、代わりにファイルテスト演算子の -s を使ってみては、 $size = -s $file;

choei
質問者

補足

ありがとうございます。 早速試してみたのですが、やはりnull値が返ってきます。 $size = -e $file; $size = (-e $file); の2パターンを試してみましたが、どちらもだめです。 もともとこの行へは$fileがnullまたは0以外の場合に飛ぶようにしてきていて$file自体は中身が何かはあるのはあるのですが・・・ 念のため if($file){ &error("ある"); } っていうかんじで確認してみましたが、やっぱり$fileのデータは存在しているようです。 というよりそのあとの行でアップロードができてますし・・・ statでも-eでもnullしか返ってこないって何が問題の可能性があるのでしょうか。 記述ミスをもちろん何度も疑い、書き直し、トラップ記述の書き方の変更、コピペでの記述などなど記述ミスに対しての検証も既に二晩やっています。 なので記述ミスはないと思いますが・・・ 他社のサーバーでは問題なく値が取れているのですが・・・ でもこの会社に確認してもstatは普通に使えると言ってましたし。 ファイルサイズが取れないと先に進めず困っています。

関連するQ&A

  • 【ruby】特異クラスを使って,File.statをカスタムしたい

    File.statに、nameというメソッドを追加したいです。 st=File.stat('hoge.txt') puts st.name #=> hoge.txt 上記のように使いたいのです。 そこで、以下の様に書いてみました。(行頭のスペースは全角です) class File  class << self   def stat(file)    st=File::Stat.new(file)    class << st     def name      @file     end    end    st   end end end st=File.stat('./hoge.txt') puts st.name #=> nil 上記実行結果はnilが出力され、期待した結果は得られませんでした。 上記の様に書いた理由を以下に記します。 クラスメソッドstatは、file.rbのclass Fileの中に定義されていて、 stat.rbのFile::Stat.new(file)を戻り値としていました。 stat.rbのclass File::Statのinitializeでは、 def initialize(file)  @file = file  (略) end となっていたので、上記の様に書いてみたのですが、何が悪いのでしょうか? ご指導のほど、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • CGIのファイルアップローダーでサイズ制限

    ファイルアップローダーで下記のCGIを書きましたが、0バイトのファイルだけはどうしても通ってしまいます。どうすればいいでしょうか? ちなみに1バイトでもあればエラーを表示してくれます。 $file_size ++; if($file_size > 1000000){ exitError("ファイルサイズが大きすぎます。1MB以下 にしてください"); } $file_size ++; if($file_size < 500){ exitError("ファイルサイズが小さすぎます。500バイト以上にして下さい。"); } $file_size ++; if($file_size == 0){ exitError("0バイトのファイルです"); } } はじめは <500 だけでもいけると思ったんですが、ダメだったんで ==0 も加えたんですが、やはりダメでした。

    • ベストアンサー
    • CGI
  • stat failed

    ディレクトリ上にあるファイルの情報を取得し表示しようとするのですが、以下のようなエラーメッセージが出てfilesize()やfilemtime()が上手く動きません。 Warning: filesize() [function.filesize]: stat failed for 1_1-2.c in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\uploaded.php on line 14 Warning: fileatime() [function.fileatime]: stat failed for 1_1-2.c in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\uploaded.php on line 15 Warning: filemtime() [function.filemtime]: stat failed for 1_1-2.c in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\uploaded.php on line 16 ファイルがphpファイルの時は何故かエラーメッセージは出ず、ちゃんと動いているようです。 調べてみたら容量2GB以上のファイルの情報を取得しようとするとこうなる場合があるとのことですが、どのファイルも100バイト程度のものです。 以下コードです。 <table border = "1"> <tr> <th>ファイル名</th><th>サイズ</th><th>最終アクセス日</th><th>最終更新日</th> </tr> <?php clearstatcache(); $dir = opendir('./files'); while($file = readdir($dir)) { if($file != '..' && $file != '.') { print('<tr>'); print('<td><a href = "files/'.$file.'">'.$file.'</a></td>'); print('<td>'.filesize($file).'バイト</td>'); print('<td>'.date('Y/m/d H:i:s', fileatime($file)).'</td>'); print('<td>'.date('Y/m/d H:i:s', filemtime($file)).'</td>'); print('</tr>'); } } closedir($dir); ?> </table> 環境はPHP5.3.2, Apache2.2です。ご教授お願いします。m(__)m

    • ベストアンサー
    • PHP
  • サーバーについてとパーミッションについての質問

    こんにちは。 私のサーバーではパーミッションの777はセキュリティのため使えず、755にしてくれと書いてあります。 しかし、フリーのCGIスクリプトを設置しようと思うと777で設定してくれと書いてあります。これを755の設定にしたらどのような影響があるのでしょうか? あとサーバーの容量が決まっているのですが、サーバー側にアップしているファイル、掲示板のログ等のサイズをまとめて知る方法はありませんか? 教えてください。よろしくお願いします。

  • アップローダーの容量

    こんにちは。 最近CGIのアップローダーが設置できるようになって、 かなり気に入って使っていたのですが、いきなりアップできなくなってしまいました。 今までアップしたファイルを少し削除したら、また新しいのがアップできたところをみると、 サーバかなんかの容量がいっぱいなのかな???と思ったのですが・・・ でも私が登録?してるホームページサーバは容量無制限なはずなので なんで容量がいっぱいになってしまったのかわかりません。 ちなみに私が設置したのはずるぼんサンのアップローダーです。 設定で ファイルサイズ制限…2MB     保存件数…100件     にしています。 今アップしてある量?…約70MB        数…65コ      です。 わかる方教えてください。

  • サーバカレント配下サブフォルダ内にファイルをアップさせたいのですが…

    ブラウザからローカルのファイルを指定して、実行ボタンを押すとサーバに、指定したファイルがアップされるプログラムを作成中です。 『copy($file, $file_name);』で、サーバにアップされるところまでは出来たのですが、このソース(.php)が存在するカレントに、ファイルがアップされてしまいます。 カレント配下に作成してあるサブフォルダ内にアップさせるには、どうすれば良いでしょうか? (もしくは、カレントにアップされたファイルを配下サブフォルダに移動でも良いですが) <以下PHPソースの抜粋> ~~~~~~~~~~~8<~~~~~~~~~~~~8<~~~~~~~~~~~ <TD nowrap><FONT size="-1">ファイル file</FONT></TD> <TD nowrap> <INPUT TYPE="hidden" NAME="MAX_FILE_SIZE" SIZE="65536"> <INPUT TYPE="file" NAME="file" SIZE="42"> </TD> ~~~~~~~~~~~8<~~~~~~~~~~~~8<~~~~~~~~~~~ <TD nowrap><INPUT id=submit1 NAME=submit1 type=submit value=" 実 行 "></TD> ~~~~~~~~~~~8<~~~~~~~~~~~~8<~~~~~~~~~~~ if ($file_name != '' && $file_size != 0) { copy($file, $file_name); } ~~~~~~~~~~~8<~~~~~~~~~~~~8<~~~~~~~~~~~

    • ベストアンサー
    • PHP
  • アップロードするとファイルサイズが大きくなる

    ホームページにファイルをアップロードすると、PCで確認したサイズより大きくなります。 結果、借りている容量を超えてしまい途中でアップできなくなります。 例えば、プロバイダーに90Mbを借りているところへエクスプローラのプロパティで  サイズが77.5Mbディスク上のサイズが103Mbのフォルダー内の物を サーバーにアップすると  サイズが77.5Mbでは上がらず、59Mbにまでサイズダウンして何とか上がります。  (ディスク上のサイズはファイルシステムの関係もあり無視します) 77.5Mbの物がアップすると90Mbを超える・・・、借りている容量も少ないので何とかしたい ・アップしてもサイズが増えない様にできないだろうか ・写真等はjpg、gifしかサーバー側が対応していないようですが、他に方法はないのだろうか 何かうまい方法があればアドバイスをお願いします  

  • PC・携帯等のアクセス時の自動振り分けについて

    現在自身でホームページを所有・管理しているのですが、index.cgiにより振り分け設定をしています(厳密に言えば、2年くらい前に人にしてもらいました)。 ところが、PC・Docomo・auに関してはそれぞれのページに振り分けられるのですがsoftbankだけはPCのページに振り分けされてしまいます。 ちなみに当方のサーバー上にあるindex.cgiに書かれてる構文は以下の通りです。 #!/usr/bin/perl $ua = $ENV{'HTTP_USER_AGENT'}; if(index($ua, "DoCoMo")>=0) { print "Location: http://www.00000.com/i/index.htm\n\n"; } elsif(index($ua, "J-SKYWEB")>=0) { print "Location: http://www.00000.com/j/index.htm\n\n"; } elsif(index($ua, "KDDI")>=0) { print "Location: http://www.00000.com/ez/index.htm\n\n"; } else { print "Location: http://www.00000.com/index.html\n\n"; } exit; 図々しいお話かもしれませんが、この構文をご訂正して頂ける方もしくは素人向けのよきアドバイスを頂ける方よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • カウンター設置うまくいかず

    http://www.tohoho-web.com/soft/wcnt.htm#Trouble このカウンター使ってますが、上手く行きません。 cgiは動きます。 cnt dat acc ががそれぞれ存在しませんというエラーが出ます。 パーミッションは間違っておらず、サーバーにもアップしてます。 ファイル名も間違ってません。 原因は何でしょう? cgiのファイルに、 $file_count = "http://www.ほにゃらら/count/$count_name" . ".cnt"; と記述してます。 本来は、$file_count = "$count_name" . ".cnt"; となっていたものを、別のサーバーにファイルを置いたため、このような記述にしてみました。 これ、間違ってますか? こういう書き方はいけないのでしょうか? アドバイス、よろしくお願いいたします。

  • HTML上(javascript)からCGIを実行する方法

    javascriptから外部実行ファイル(javascriptファイルではなくperlなどのCGI) を実行する方法を探しています。 下記のようにindex.htmとtest.cgiファイルを用意して、index.htm内の javascriptから外部cgiを実行させ、cgiの結果(test.cgiでは単に 『test』と表示するのみ)を表示したいと考えています。 利用増ですが、cgiやssiが使用できないサーバにindex.htmを置いて、 cgiが使用できるサーバ上のcgi結果を取得したいものです。 通常のcgiのように、1ページでcgi結果を表示するものではなく、 HTMLファイルの一部にcgi処理結果を表示させたいものです。 そもそも、SSIを使用しなければ下記のようなHTML内にcgiなどの 実行結果を表示する事は出来ないのでしょうか。 よろしくお願い致します。 ※下例のプログラムではcgi結果は表示されませんでした・・・。 ---<index.htm>---------------------------------------- <HTML> <BODY> <SCRIPT language="Javascript" src="http://xxx.xxx.xxx.xxx/test.cgi"></SCRIPT> </BODY> </HTML> ---<test.cgi>---------------------------------------- #!/usr/bin/perl print "test"