- ベストアンサー
statの戻り値が返ってこない
CGIでファイルアップをするために次の構文を入れて容量をチェックしようと思いました。 $size = (stat("$file"))[7]; しかし$sizeには何も数値が返ってきません。 それでも$fileのファイルはアップできています。 サーバー会社に聞いても普通に使えると言いますし、同一の構文を他社サーバーで利用しています。 @size = stat("$file");や @size = stat $file;で $size[7]の数値をとるやり方でやっても結果は同じく何も返ってこずnullです。 6など違うインデックスを入れてみても同じ結果です。 この場合何が問題の可能性があるのでしょうか。 ファイルそのものはアップできていますが、容量制限やサイズによっての振り分けなどができず困っています。 誰かご存じの方ご教授ください。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> どういうプログラムを組めばクライアントPCでリストを作成し、サーバに送れるのでしょうか。 > 何か参考になるURLなどご存じないでしょうか。 適当な URL は知らないのですが、次のようになるかと思います。 1)手作業でリストファイルを作成するのも1方法です。エディタで作成する、dir (DOS 系) または ls (Unix 系) の出力を編集する、といった方法があります。また、Perl はこの 分野も得意ですので、プログラムで自動化することもできます。 2)リストファイルをサーバーに送るのは、CGI ファイルを送ったのと同じ方法が使えるで しょう。その際、リストファイルの文字コードをサーバーの文字コードと合わせておき ます。リストファイルが ASCII コードのみで、FTP のアスキーモードで転送する場合は、 (たぶん) FTP が改行文字を変換してくれるので大丈夫でしょう。 3)CGI をリストファイルを見ながら処理を進めるように修正する。 なお、容量制限には対応できませんが、振り分けだけならばいったんサーバーに受け取って、 その後振り分けるという処理が、CGI でできます。こっちの方が、簡単かもしれません。 どのみち容量オーバーのファイルは、そのままでは送ることができないので、除外しておけ ばよいと思います。
その他の回答 (4)
- kumoz
- ベストアンサー率64% (120/185)
> 他社サーバーではこれで十分アップされるファイルが事前に確認できていたので、これでいいと思っていたのですが、今のサーバーがそういう仕様になっていないということでしょうか。 stat は os のシステムコールを利用してファイル情報を取得しているので、 os の管理外であるクライアントのパソコンからファイル情報を取得することは できないはずです。他社サーバーで使っていたコードは、今回のコードとは 少し違っているのではないかと思うのですが? > その場合、Perlスクリプトでアップしようとしているファイルのファイルサイズを確認することは無理なのでしょうか。 具体的な処理がわからないので答えにくいのですが、クライアントのパソコンで アップするファイルのリストを作成して、それをサーバーに渡してはどうでしょ うか。リストをファイルにすれば、FTP で送ることもできますし、CGI からも取 得できると思います。
補足
返信ありがとうございます。 >他社サーバーで使っていたコードは、今回のコードとは >少し違っているのではないかと思うのですが? 全く同じです。そのままコピペしたので。 >クライアントのパソコンでアップするファイルのリストを作成して、 >それをサーバーに渡してはどうでしょうか。 知識不足ですみません。 どういうプログラムを組めばクライアントPCでリストを作成し、サーバに遅れるのでしょうか。 それをなんと呼ぶのかすら分からないので、ネットでも探せず困っております。 何か参考になるURLなどご存じないでしょうか。
- 11th_style
- ベストアンサー率50% (45/90)
> statや-eはファイルがサーバー上に存在する必要があるという前提の構文なのでしょうか。 はい、そうですよ。大抵はファイルのinodeを見る実装になっていると思います。 > アップロードする途中でそのファイルのサイズをチェックしてアップするかしないかを判断する 恐らく、前に試された方法では、サーバ上にtempファイルができてそのPATHを受け取っていたんでしょう。
補足
何度もご返答頂きありがとうございます。 >>statや-eはファイルがサーバー上に存在する必要があるという前提の構文なのでしょうか。 >はい、そうですよ。 そうだったのですか。 他社サーバーではこれで十分アップされるファイルが事前に確認できていたので、これでいいと思っていたのですが、今のサーバーがそういう使用になっていないということでしょうか。 その場合、Perlスクリプトでアップしようとしているファイルのファイルサイズを確認することは無理なのでしょうか。 何か他の方法またはスクリプトで確認することってできないのでしょうか。
- kumoz
- ベストアンサー率64% (120/185)
少し疑問があるのですが、 > というよりそのあとの行でアップロードができてますし・・・ のように書かれていますが、stat や -s を実行する時点で、サーバーにファイルが 存在する必要があるのではないでしょうか。ファイルの実体がない段階で stat を実行しているような感じがするのですが?
補足
うまく言えないのですが、 ファイルの実態がないとだめなのですか? アップロードする途中でそのファイルのサイズをチェックしてアップするかしないかを判断する・・・という使い方を他のサーバーではしていたので、その部分を流用したのですが。 サーバー上にファイルの実態がないときに利用できないのであれば、もちろん意味ないですよね? ただ私としてはアップする前の段階として送られてきたファイルの容量を確認してどうするかを分岐させたいのです。 statや-eはファイルがサーバー上に存在する必要があるという前提の構文なのでしょうか。
- kumoz
- ベストアンサー率64% (120/185)
詳しいことはわかりませんが、stat はシステムに依存しているように思います。 Unix のシステムでは、間違いなくうまく動くのでしょうが。 サイズが必要なだけならば、代わりにファイルテスト演算子の -s を使ってみては、 $size = -s $file;
補足
ありがとうございます。 早速試してみたのですが、やはりnull値が返ってきます。 $size = -e $file; $size = (-e $file); の2パターンを試してみましたが、どちらもだめです。 もともとこの行へは$fileがnullまたは0以外の場合に飛ぶようにしてきていて$file自体は中身が何かはあるのはあるのですが・・・ 念のため if($file){ &error("ある"); } っていうかんじで確認してみましたが、やっぱり$fileのデータは存在しているようです。 というよりそのあとの行でアップロードができてますし・・・ statでも-eでもnullしか返ってこないって何が問題の可能性があるのでしょうか。 記述ミスをもちろん何度も疑い、書き直し、トラップ記述の書き方の変更、コピペでの記述などなど記述ミスに対しての検証も既に二晩やっています。 なので記述ミスはないと思いますが・・・ 他社のサーバーでは問題なく値が取れているのですが・・・ でもこの会社に確認してもstatは普通に使えると言ってましたし。 ファイルサイズが取れないと先に進めず困っています。
お礼
ありがとうございました。 ちょっと時間がかかりそうですが何とかやってみます。 ありがとうございました