CekePHPでfile_exists関数を使う

このQ&Aのポイント
  • CakePHP Ver1.3.6でfile_exists関数を使用しています。
  • 2バイトのファイル名の画像の存在を判定する際に、file_exists関数を使用しましたが、存在するファイルがfalseになってしまいます。
  • アクション内での判定とapp/webrootフォルダ内の判定で結果が異なるのはなぜでしょうか?
回答を見る
  • ベストアンサー

CekePHPでfile_exists関数を使う

CakePHP Ver1.3.6で開発をしています。 アクションの中で、画像の存在判定にfile_exists関数を使ったのですが、 2バイトのファイル名のファイルの場合、存在するファイルがfalseになって しまいます。 対象のファイルが存在するときに、 if (file_exists('img/漢字.jpg')) echo 'あります'; else echo 'ありません'; if (file_exists('img/filename.jpg')) echo 'あります'; else echo 'ありません'; このとき、前者は’ありません’、後者は’あります’と表示されます。 app/webrootフォルダにtest.phpを作り、その中で同じ判定をすると、 両方とも’あります’と表示されます。 なぜアクションの中に記述したときのみ、2バイトファイル名を正しく 判定できないのでしょうか?

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

文字コードは統一できていますか? ・システム側で、ファイルシステムに使われている文字コード ・PHPファイル中でファイル名の指定に使っている文字コード この二つが一致していないと、一見同じに見えても文字コードのバイト列レベルでは別の文字列になり、「ありません」と判定されることになります。 おそらく、たまたまtest.phpの方はファイルシステムと同じ文字コードで記述されているだけなのではないかと思います。

LFNAtacker
質問者

お礼

ありがとうございました。おっしゃる通りでした。実に基本的なところを見落としていて、恥ずかしいです。 いついもLinux上での開発をしていたところ、今回WindowsのXAMPPでの開発に移ったことが原因のようです。 ありがとうございました。

関連するQ&A

  • file_existsが動作しない

    お世話になります。 $IMG_URL = "http://hoge.hoge/"; $test = 1; $logo_url = $IMG_URL."logo/".$test."jpg"; if(file_exists($logo_url)){ $var = "あるよ!"; }else{ $var = "ないよ!"; } という形で画像ファイルが存在するかを調べているのですが、PHPに直接記述した場合動作し、functionの中に入れると動作しなくなるのはなぜでしょうか? function pict($test){ $IMG_URL = "http://hoge.hoge/"; $test = 1; $logo_url = $IMG_URL."logo/".$test."jpg"; if(file_exists($logo_url)){ $var = "あるよ!"; }else{ $var = "ないよ!"; } return $var; } 上記のfunction内に入れた場合、returnの値が「ないよ!」になってしまうのです。 どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPのfile_exists関数について

    file_existsで特定のフォルダにファイルが存在するかどうかを調べたいのですが、 フォルダの中にあるファイル数が大量の場合、負荷はファイル数に応じて大きくなるんでしょうか? たとえば、ファイルが5万件ある場合でも、file_exists関数は問題なく使えるんでしょうか? あるいは、mysqlなどのデータベースを利用した方が賢明でしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • file_exists関数について

    file_exists関数を使っていますが、 指定した場所にファイルは存在するにもかかわらず、 Falseが戻ってきてしまいます。 WinXp PHP5 の環境で、ローカルにて行っています。 ファイルはc:commoninit.ini というファイルです。 同パスにinit.iniをおいているのですが。 なにか条件があるのでしょうか。 ご教授願います。

    • 締切済み
    • PHP
  • ループ処理された中でfile_existsによる画像サイズが取得できま

    ループ処理された中でfile_existsによる画像サイズが取得できません。 ループlist関数で変数代入しDisp_Img_Tag_02関数へ引数を渡した場合に引数側へ変数は渡っていることは確認しているのですが、問題解決に至りません。コードの問題指摘と解決方法をアドバイスください。 ログファイル/  1,ばなな,黄色いくだものです,1278105473-01.jpg <?php $logfile = "./db.csv"; //ログデータ $array_log = file($logfile); for($i=0; $i<count($array_log); $i++){ list($code,$text_01,$area_01,$img_01_Filename) = split(",", $array_log[$i]); echo Disp_Img_Tag_02("1278105473-01.jpg")."<br>"; //(1)直接ファイルを指定 echo Disp_Img_Tag_02("$img_01_Filename")."<br>"; //(2)***ここが問題です。 } echo "<br><br>"; $img_01_Filename = "1278105473-01.jpg"; echo Disp_Img_Tag_02("1278105473-01.jpg")."<br>"; //確認用OK echo Disp_Img_Tag_02("$img_01_Filename")."<br>"; //確認用OK function Disp_Img_Tag_02($img_name, $type) { $path = realpath( "." )."/img/"; //アップロード画像パス $up_dir = '/img/'; //画像リンク先パス $w_admin_max = 30; //管理用サイズ $h_admin_max = 30; $w_user_max = 100; //ユーザー用サイズ $h_user_max = 100; $img_tag = ""; if($img_name && file_exists("$path$img_name")){ list($width, $height, $dummy01, $dummy02 ) = getimagesize("$path$img_name"); if($width > $w_admin_max || $height > $h_admin_max){ $w_rate = $w_admin_max / $width; $h_rate = $h_admin_max / $height; ($w_rate < $h_rate) ? $key = $w_rate : $key = $h_rate; $width = (int) $width * $key; $height = (int) $height * $key; $img_tag = $img_tag."<a href=.$up_dir$img_name target=_blank><img src=.$up_dir$img_name width=" . $width . " height=" . $height . " border=0></a>\n"; }else{ $img_tag = $img_tag."<img src=.$up_dir/$img_name border=0>\n"; } $img_tag = $img_tag."<input type=hidden name=fname01 value=\"$img_name\"><input type=checkbox name=fname01_del value=1>削除\n"; $img_tag = $img_tag." 上書:<input type=file name=upfile01 size=15>\n"; }else{ $img_tag = $img_tag."登録 <input type=file name=upfile01 size=20> 確認用ファイル名 $img_name\n"; } return $img_tag; } ?>

    • ベストアンサー
    • PHP
  • preg_matchの使い方

    選択した画像ファイルをgifフォルダにアップロード保存して 同入力画面にも出力するサンプルの勉強をしています。 「preg_match」を使ってアップロードできるファイルを gif,jpg,pngに限定するというようにしたいのですが 使い方が間違っているようで上手く行きません。 どこが間違っているのでしょうか? よろしくお願いいたします。 ---------------------------------------------------------- <html> <body> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="data"> <input type="submit" value="表示"> </form> <?php $updir = "./gif/"; $filename = $_FILES["data"]["name"]; if(file_exists($_FILES["data"]["tmp_name"])){ $filesize = filesize($_FILES["data"]["tmp_name"]); if($filesize <= 100000){ if(preg_match("/\.gif$ | \.jpg$ | \.png$/", $filename)){ ←←※※※ move_uploaded_file($_FILES["data"]["tmp_name"], $updir.$filename); echo "ファイル名".$filename."アップロード成功!"; echo "<br><br>"; echo "<img src='./gif/$filename'>"; }else{ echo "jpg,pngもしくはgifのファイルしかアップできません。"; } }else{ echo "$filesize バイト。ファイルサイズが大きすぎます。"; } } ?> </body> </html> ----------------------------------------------------------

    • ベストアンサー
    • PHP
  • 【file_exists】ファイルが存在するのに、存在しないとなります

    いつもお世話になっております。 ■環境■ PHP5 Windows ■状況■ フォルダ内にtextファイルが20~45個入っております(個数は状況によって変わります)。 ■目的■ フォルダのtextファイルの中身を参照し、各textファイルに必ず含まれる数字を取り出す。でございます。 ■方法■ (1)フォルダにあるファイル名を取りだす (2)fopenで読み込み(r)で全部を見、数字を別ファイルに書き込む と考えたのですが、(1)で.、..というよくわからないファイルも一緒に出てきてしまったので、file_existsでファイルが存在するか確認してから(2)に移ろうとお思いました。 が、ファイル名は全部ないといわれてしまうのです。 しかしfile_exists($filename)の$filenameを表示させ、ブラウザにこぴぺするとtextデータは出てきます。 以下プログラムの一部です ※$cは(1)で得たフォルダ内にあるファイル名をループでまわしている値です for($b=0;$b<$a;$b++){  $filename="C:/Inetpub/wwwroot/php/kore/1/".$c; if (file_exists($filename)) { print "あるよ<BR>"; } else { print "ないよ<BR>"; } } 結果は(一部です) C:/Inetpub/wwwroot/php/kore/1/.text⇒ないよ C:/Inetpub/wwwroot/php/kore/1/..text⇒ないよ C:/Inetpub/wwwroot/php/kore/1/0155442A5.txt⇒ないよ C:/Inetpub/wwwroot/php/kore/1/01762602A.txt⇒ないよ です。 上記の C:/Inetpub/wwwroot/php/kore/1/01762602A.txt C:/Inetpub/wwwroot/php/kore/1/0155442A5.txt は確実に存在しております。 どこがおかしいのか、ご教授いただければ幸いです よろしくお願いいたします

    • ベストアンサー
    • PHP
  • function_exists関数の挙動について

    以下のphpのコードを実行すると、 「hogehoge()関数が定義済みです。」とブラウザに表示されます。 ですが、スクリプトは上から下へ向かって実行されるわけで、 <if(function_exists('hogehoge'))>の箇所では、hogehoge関数はそんざいしないのでfalseに なると思うのです。 いったいどういう理屈なんでしょうか? よろしくお願い申し上げます。 (なお、下記ソースではタブを全角空白4文字に変換しています) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>関数が定義済みか調べる</title> </head> <body> <div> <?php if(function_exists('hogehoge')){     echo 'hogehoge()関数が定義済みです。'; }else{     echo 'hogehoge()関数は未定義です。'; } function hogehoge(){} ?> </div> </body> </html>

    • ベストアンサー
    • PHP
  • ファイルの存在チェックとエンコード

    自分なりに調べてファイルの存在チェック後、filemtime順にソートを する処理を書いてみましたがいまいち自信がないので、ご教授お願いします。 後、エンコードがうまくいかないのか日本語を出力しても表示がされません。 ご指摘ご教授お願いします。 <html> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> <?php //ファイルの存在チェック if (file_exists('hoge01.html')) { $page['hoge1.htm'] = filemtime('hoge01.html'); } if (file_exists('hoge02.html')) { $page['hoge2.htm'] = filemtime('hoge02.html'); } if (file_exists('hoge03.html')) { $page['hoge3.htm'] = filemtime('hoge03.html'); } //ファイルが空の場合の処理 if($page == false) { echo "ファイルが存在しません。"; } //ファイルが存在すればfilemtime順にソートの処理 else{ asort($page); foreach($page as $key => $value){ echo $key; echo "<br>"; echo "<hr>"; } } ?> </html>

    • 締切済み
    • PHP
  • file_existsでファイル名の部分一致で検索

    PHPの勉強中なのですが、指定フォルダにあるファイルを、部分一致で存在チェックしたいのですが、file_existsでは、正規表現とかは使えないのでしょうか? それとも、readdirでファイル一覧を取得して、そこから検索して存在チェックするのでしょうか?

    • ベストアンサー
    • PHP
  • bash ファイルなし判定

    現在bash scriptにおいてファイル存在判定を下記のように しています。 if [ -s "tmp.txt" ]; then (dummy=1) else echo " no [tmp.txt] file" exit fi -sでファイルがある場合のelseとしていています。 if文で直接ファイルが"ない"という判定はどのように 記載するのでしょうか?