- ベストアンサー
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 も加えたんですが、やはりダメでした。
- anzyaa
- お礼率60% (24/40)
- CGI
- 回答数6
- ありがとう数4
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
訂正(スマソ) $file はファイルとして保存するためにあるのですね while($bytesread = read($filename, $buffer, $BUFSZ)){ $file .= $buffer; $file_size += length($buffer); } で一回やめて if ($file_size > 1000000){ exitError("1つめのError! Size : $file_size byte"); } elsif ($file_size < 500) { exitError("2つめのError! Size : $file_size byte"); } else { exitError("OK! Size : $file_size byte"); } では どうでしょ?
その他の回答 (5)
while($bytesread = read($filename, $buffer, $BUFSZ)){ $file .= $buffer; $file_size; if ($file_size > 1000000){ exitError("1つめのError! Size : $file_size byte"); } elsif ($file_size < 500) { exitError("2つめのError! Size : $file_size byte"); } else { exitError("OK! Size : $file_size byte"); } たぶんこの他にいろいろ省いていると思うので、想像しながら追っていくと $file は何に使うのかわからないのですが・・・ $bytesreadは読み込んだバイト数です また最後に(End-Of-File)になると0を返します つまり、サイズを加算している? つもりなら $file += $buffer では? $BUFSZはたぶん1024ですよね $file_size は初期化したままなのでずっと0ですね $bufferはアップロードされたファイルの中身ですよね つまり $file_size = length($buffer) でアップロードされたファイルのサイズが出る これだけを見るのならwile文の外でサイズ判定したほうがいいのでは
つまり500以上1000000以下はOKということですよね 視点を変えてエラーメッセージを変えてみては? if($file_size > 500 && $file_size < 1000000) { exitError("ファイルは500バイト以上1メガバイト以下にしてください Size: $file_size"); } これでもダメなら $file_size を取得する部分も教えてくださいな
補足
>つまり500以上1000000以下はOKということですよね いえ。1.5KBのファイルで2つ目のエラーというのは明らかに上手くいっていないということになります。 一応、ファイル取得からサイズ制限までの部分を抜き出しときます。 $query = new CGI; $id = $query->param('id'); ##$data = $query->param('data'); ## ファイル種類 $filename = $query->param('filename'); # ファイル名の取得 $ostype = $query->param('ostype'); # OSの種類の取得 $ip = $ENV{'REMOTE_ADDR'}; if( $id eq "" || $filename eq "" ){ &exitError("入力された値が間違っているか、または入力されていない項目があります。"); } ## ## $filename からファイル名部分を抽出 ## Windowsに対応 @f = split(/\\/, $filename); $basename = $f[ $#f ]; if( $basename =~ /[\s|,]/ ){ &exitError("ファイル名に空白またはカンマが含まれています。"); } ## 処理ロック &lock; ## 転送先ディレクトリの決定 $dir = "$save_dir/$id"; ## 転送先ディレクトリがなければ作成する。 if( ! -d "$dir" ) { mkdir "$dir", 0777; } # MIMEタイプの取得 $type = $query->uploadInfo($filename)->{'Content-Type'}; while($bytesread = read($filename, $buffer, $BUFSZ)){ $file .= $buffer; $file_size; if ($file_size > 1000000){ exitError("1つめのError! Size : $file_size byte"); } elsif ($file_size < 500) { exitError("2つめのError! Size : $file_size byte"); } else { exitError("OK! Size : $file_size byte"); }
- Kendai
- ベストアンサー率45% (36/79)
またまた#1です。 ちょっと質問を読み違えていたかも知れません。でも、今までの回答で大丈夫です。 エラー表示の時に $file_size の中身(数値)が表示されますので、アップロードしたファイルのサイズと極端に違う場合は、ファイルサイズの取得の仕方を間違ったか、変数をどこかで足したり、かけたりしているかが考えられます。 あと、どのような用途か分かりませんが、500バイト以下でも通してしまっていいような気がします。その代わりに、$file_size == 0 のときにエラーにしてしまっていいような…(^^;)> if ($file_size > 1000000){ exitError("1つめのError! Size : $file_size byte"); } elsif ($file_size < 500) { exitError("2つめのError! Size : $file_size byte"); } else { exitError("OK! Size : $file_size byte"); }
お礼
やはりこの部分以外に問題があるようですね。 0バイトのファイルは通ります 30バイトくらいのファイルは2つ目のエラー 1.5KBのファイルでも2つ目のエラー おっしゃるとおり、500バイトではなく、0バイトの時のみで問題ありません。知人に頼まれて500バイト以下にしてくれと言われましたが、結局は0バイトがブロックできればいいです。 アップローダーでファイルを参照した後にファイル名を変える人が多く、しかもなぜかアップロードできてしまうという現象が起きます。 でも実際はそんなファイルは存在しませんから、結局は空のファイルがアップロードされます。そのファイルサイズが0バイトなもんで、それをブロックしたいと。 なにせ、5000人規模が使用するアップローダーなもんで、結構、重要だったりするわけです。 そんな重要なCGIを詳しくない私に任されても。という感じなのですが(^^;; 話がそれましたが、ファイルの所得が間違ったりしている可能性があるということなので、それについて。 FORMでのアップローダーでCGIに処理を行わせるものです。 $filename = $query->param('filename'); # ファイル名の取得 これでファイルを所得しています。
- Kendai
- ベストアンサー率45% (36/79)
再び#1です。 これでもダメですかね…? if ($file_size > 1000000){ exitError("Error! Size : $file_size byte"); } elsif ($file_size < 500) { exitError("Error! Size : $file_size byte"); } else { exitError("OK! Size : $file_size byte"); } 全体の流れがよく分からないので、デバッグができるようにエラーメッセージを上のようにしてみました。どこがおかしいか分かりやすくなると思います。 ただし、正常な場合でもエラーメッセージが出るようにしています。意図したとおりに動くようになれば、else以降を消して下さい。
お礼
再びありがとうございます。 コピペしてみましたがダメでした。 0バイトのファイルは普通にアップロードされますし、そのほかのサイズだと全てErrorと表示されてしまいます。 これはやはりこの部分以外の問題なんでしょうか?
- Kendai
- ベストアンサー率45% (36/79)
ご質問を見る限り、$file_size ++;を通るたびに$file_sizeの値が1ずつ増えているので、それをなくせばわざわざ==0をつけなくとも解決しそうです。 あと、ifやelseなどの分岐処理をうまく使いこなすことで、よりスマートに命令文を記述できます。 いろんなサイトで解説されていますので、がんばって探して下さい(^^)
お礼
返信とアドバイスありがとうございます。 ++を消しましたがダメでした。 あと、新たな問題を発見しまして、500バイト以上のファイルも通さないことに気づきました。 このCGIは書き方間違っているんでしょうか? ご教授お願いします。
関連するQ&A
- アップローダー「PHP」について
まずは下記サイトをご覧ください。 PHPのアップローダーです。 http://www.netmania.jp/cgi/112.php サンプルを見るとおわかりの通り、 http://www.netmania.jp/cgi/up/ 仕様に、 >>■ファイルは800 KBまでアップロード可能です。 と書かれています。 これを →10MBまでアップロード可能に直したいのです。 しかし、単純にファイル内の ------------------------------------------- $limitk = 800; //アップロード制限(KB キロバイト) ------------------------------------------- を以下の様に、 ------------------------------------------- $limitk = 10000; //アップロード制限(KB キロバイト) ------------------------------------------- このように変更しても全く意味がありませんでした。 同ファイル下に以下のようなプログラムがあります。 これが少々ひっかかるのですが、もしかしたらここでしょうか? ------------------------------------------- function FormatByte($size){//バイトのフォーマット(B→kB) if($size == 0) $format = ""; else if($size <= 1024) $format = $size."B"; else if($size <= (1024*1024)) $format = sprintf ("%dKB",($size/1024)); else if($size <= (10*1024*1024)) $format = sprintf ("%.2fMB",($size/(1024*1024))); else $format = $size."B"; return $format; } ------------------------------------------- おそらくこの部分に関係してると思うのですが、 初心者な私は具体的にどう変更したら良いのかわかりません。 ご教授願います。
- ベストアンサー
- PHP
- アップローダCGIについて
Webにファイルをアップローダのcgiを探してしています。毎日アップするので、アップした日付がでる 機能希望です。 おすすめなCGIがありましたらよろしく御願いします。
- ベストアンサー
- その他([技術者向] コンピューター)
- アップローダーの容量
こんにちは。 最近CGIのアップローダーが設置できるようになって、 かなり気に入って使っていたのですが、いきなりアップできなくなってしまいました。 今までアップしたファイルを少し削除したら、また新しいのがアップできたところをみると、 サーバかなんかの容量がいっぱいなのかな???と思ったのですが・・・ でも私が登録?してるホームページサーバは容量無制限なはずなので なんで容量がいっぱいになってしまったのかわかりません。 ちなみに私が設置したのはずるぼんサンのアップローダーです。 設定で ファイルサイズ制限…2MB 保存件数…100件 にしています。 今アップしてある量?…約70MB 数…65コ です。 わかる方教えてください。
- ベストアンサー
- その他([技術者向] コンピューター)
- アップローダCGIエラーについて
アップローダのCGIを設置してテストを行って います。CGIにアクセスするとSoftware error can't open dir と表示されるのですが、対処方法および 解決策があればよろしく御願いします。 WEBサーバ環境はAPACHEです。
- ベストアンサー
- その他([技術者向] コンピューター)
- ファイルサイズ制限について
いつもお世話になります。 perlのプログラムファイルアップロードをよく見るとでファイルサイズ制限をしている箇所があります。 たとえば以下のステートメントです。 $BUFSZ = 2048; $file_size ++; if($file_size > 300){ exitError("ファイルサイズが大きすぎます。600KB 以下にして下さい。"); この場合$BUFSZ = 2048; とはいったい何なのでしょうか? また上記例ではファイルサイズ600Kに制限されておりますが、300を超えた場合にエラーに成るようです。これは2Kをかけたものが実ファイルサイズという事に成っているのでしょうか? どなたかご教示願います。
- ベストアンサー
- Perl
- 画像アップローダーCGIを探しています
http://wws.cside.com/cgi-plant/diary/uploader/ 現在、こちらの画像アップローダーCGIを使用しているのですが、 削除が不便(passを伝えた一部の人しか削除できない)なので別のアップローダーを探しています。 ・画像をアップロードした時にサムネイルが表示される ・削除キーが設定できる ・画像以外もアップロードできる(これは無くてもかまいません) 上記の条件に当てはまるアップローダーCGIはありませんでしょうか? どうぞよろしくお願い致します。
- 締切済み
- CGI
- アップローダ掲示板
曲をどこかにアップしたいのですが、ファイルサイズの上限があるものばかりで、中々良いところが見つかりません。ファイル形式はmp3でサイズは2.7MBです。 どなたか、良いアップローダ掲示板を教えてもらえると、助かります。宜しくお願い致します。
- ベストアンサー
- その他(インターネット・Webサービス)
- アップローダー設置
こんにちは。 今アップローダーの設置に挑戦中で、 http://sugachan.dip.jp/download/uploader.php のアップローダーはなんとか設置できたのですが、 ↓ココ↓のuploader.cgiの http://cgi.2lbox.org/?lang=1 アップローダーが設置したいのですが、できません。 間違ってるのかもしれませんが、 FFFTPで転送しても『Software error』と出てしまって表示できません。 どうすればいいのでしょうか? どなたか教えてください。
- ベストアンサー
- その他([技術者向] コンピューター)
- アップローダー探しています。
こんにちは、または初めまして。 今回は下記の条件に当てはまるアップローダーを探しています。 ・mp3ファイル可能 ・6MGぐらいまでのサイズならOK ・最低一週間残る(保存期間が長ければ長いほど良いです) 宜しくお願いいたします。
- ベストアンサー
- その他(インターネット・Webサービス)
- アップローダー探してます
アップローダー探してます 自分が昔に利用していたアップローダーなのですが、なかなか見つけられません。探していたものと違うのでもかまいませんから、似たようなサイトをご存じの方がいらっしゃいましたら教えていただきたいです。 1:うpできるファイルの種類が画像で、音声、動画は対応外だったと思う 2:うpする際にパスワードがかけられた。画像認証はない 3:http://www.dotup.org/のような他人がアップしたファイルが表示されていない 4:上限は数百キロバイトもしくは数メガバイトだった気がする
- ベストアンサー
- その他(インターネット・Webサービス)
お礼
edamsさんの言うように、一度処理を止めてからファイル制限のプログラムを開始させたところ上手くいきました。 どうもありがとうございました。