1324735392 PHPでファイルを複数アップロードができません。だれかアドバイスください。

処理の流れは3つファイルの拡張子に一つでも「jpeg」意外が含まれていたら、エラー内容を表示する。エラーがないならアップロードします。
なのに、jpegファイルをあげたのに「Warning: preg_match() [function.preg-match]: Unknown modifier '\' 」というエラーがでます。

このような処理をしたい場合、みなさんはどのようなコードを書きますか?
よろしければアドバイスください。

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2011/12/24 23:03:14
  • 終了:2011/12/26 18:24:06

ベストアンサー

id:a-kuma3 No.1

a-kuma3回答回数4605ベストアンサー獲得回数19432011/12/24 23:17:04

ポイント50pt

preg_match に指定するパターン (第一引数) は、

"(^[a-zA-Z0-9_-]+)\.(jpeg)"

じゃなくて、

"/(^[a-zA-Z0-9_-]+)\.(jpeg)/"

かな。

http://jp2.php.net/manual/ja/function.preg-match.php

id:kyouryukun

質問を締め切っていたのに、わざわざコメントでお返事していただきありがとうございます。

2011/12/29 09:56:17

その他の回答(1件)

id:a-kuma3 No.1

a-kuma3回答回数4605ベストアンサー獲得回数19432011/12/24 23:17:04ここでベストアンサー

ポイント50pt

preg_match に指定するパターン (第一引数) は、

"(^[a-zA-Z0-9_-]+)\.(jpeg)"

じゃなくて、

"/(^[a-zA-Z0-9_-]+)\.(jpeg)/"

かな。

http://jp2.php.net/manual/ja/function.preg-match.php

id:kyouryukun

質問を締め切っていたのに、わざわざコメントでお返事していただきありがとうございます。

2011/12/29 09:56:17
id:kodairabase No.2

kodairabase回答回数661ベストアンサー獲得回数802011/12/24 23:58:06

ポイント50pt

エラー行を以下のようにしてみてください。

if (! preg_match("/(^[a-zA-Z0-9\-]+)\.(jpeg)/", $filename)) {
  • id:rouge_2008
    JPEG画像の拡張子は、jpegだけでなくjpgの場合もあるので、「(jpe?g)」とするといいかもしれません。
    それから、拡張子の大文字にも対応するように、iオプションを指定します。

    if(!preg_match("/(^[a-zA-Z0-9_-]+)\.(jpe?g)/i", $filename))
  • id:rouge_2008
    「Unknown modifier '\' 」エラーは、a-kuma3さんの回答で解決するはずなので見落としていました・・・
    フォームで「name="file[]"」としているのに、「foreach ($_FILES["file"]["error"] as $key => $value) {」では処理が進まないと思います。
    「foreach ($_FILES["file"] as $key => $value) {」とします。

    http://php.net/manual/ja/feature-fileupload.multiple.php

    ※誤字があったのでコメントし直しました。
  • id:a-kuma3
    あ、本当だ。
    preg_match のエラーのようだったので、そこにしか目が行ってませんでしたわ ><
  • id:rouge_2008
    上記は私の勘違いのようです。
    「$_FILES["file"]["error"] 」も存在するので大丈夫のようですね。
    失礼しました。
  • id:rouge_2008
    > a-kuma3さん

    すみません。上記は私の勘違いです。(^^;
    ただ、「if ($value == UPLOAD_ERR_OK) {」の箇所が不思議です。
    何処かに値を設定している箇所があると思いますが、無い場合は上手く動作しないと思います。
    何もエラーが出なければ、値は「0」になっているようですので・・・

    http://www.php.net/manual/ja/reserved.variables.files.php
  • id:a-kuma3
    http://php.net/manual/ja/features.file-upload.errors.php
    これですね。
    面白い >PHP
  • id:a-kuma3
    「if ($value == UPLOAD_ERR_OK) {」を閉じている "}" は、もっと後の方じゃないと駄目かな。
  • id:rouge_2008
    > 「if ($value == UPLOAD_ERR_OK) {」を閉じている "}" は、もっと後の方じゃないと駄目かな。

    無駄な処理をさせない為には、その方がいいかもしれませんね。
    「if (count($errors) === 0) {」の処理の後ろで閉じた方が、ファイル名による画像形式の評価とかもしなくて済みますし・・・
  • id:kyouryukun
    こんな夜遅くにみなさんありがとうございます。
    「if (count($errors) === 0) {」の処理の後ろで閉じてみます。
    foreach ($_FILES["file"]["error"] as $key => $value) {
    // アップロード成功した際の処理
    if ($value == UPLOAD_ERR_OK) {
    // ファイル名
    $file_name = $_FILES["file"]["name"][$key];
    $file_temp = $_FILES["file"]["tmp_name"][$key];
    }
    //ファイル名が英数字でjpegでないのなら
    if(!preg_match("/(^[a-zA-Z0-9_-]+)\.(jpe?g)/i", $filename)) {
    //エラーを表示する
    $errors["file"] = "jpegファイルしかできません";
    }
    //エラーが0なら
    if (count($errors) === 0) {
    // 保存するファイル名
    $file = "./up/" . $file_name;
    //アップロードする
    move_uploaded_file($file_temp, $file);
    echo "ファイルのアップロードに成功しました。<br />";
    }
    }

    こんなかんじかな?
  • id:rouge_2008
    はい、閉じる場所を変更した場合は、以下のようになります。
    ※一部省略しているコードだと思いますが、そのままコピーしています。

    foreach ($_FILES["file"]["error"] as $key => $value) {
    // アップロード成功した際の処理
    if ($value == UPLOAD_ERR_OK) {
    // ファイル名
    $file_name = $_FILES["file"]["name"][$key];
    $file_temp = $_FILES["file"]["tmp_name"][$key];
    //}//これをもっと後ろに

    //ファイル名が英数字でjpegでないのなら
    if(!preg_match("/(^[a-zA-Z0-9_-]+)\.(jpe?g)/i", $filename)) {
    //エラーを表示する
    $errors["file"] = "jpegファイルしかできません";
    }

    //エラーが0なら
    if (count($errors) === 0) {
    // 保存するファイル名
    $file = "./up/" . $file_name;
    //アップロードする
    move_uploaded_file($file_temp, $file);
    echo "ファイルのアップロードに成功しました。<br />";
    }
    }//ここに移動しました。
    }
  • id:rouge_2008
    $errorsは「echo $errors["file"] = "jpegファイルしかできません";」で使用しているだけなのでしたら、「if (count($errors) === 0) {」ではなく「else {」の方がいいかもしれません。

    foreach ($_FILES["file"]["error"] as $key => $value) {
    // アップロード成功した際の処理
    if ($value == UPLOAD_ERR_OK) {
    // ファイル名
    $file_name = $_FILES["file"]["name"][$key];
    $file_temp = $_FILES["file"]["tmp_name"][$key];
    //}//これを後ろに移動済み

    //ファイル名が英数字でjpegでないのなら
    if(!preg_match("/(^[a-zA-Z0-9_-]+)\.(jpe?g)/i", $filename)) {
    //エラーを表示する
    echo $errors["file"] = "jpegファイルしかできません";
    } else {
    // 保存するファイル名
    $file = "./up/" . $file_name;
    //アップロードする
    move_uploaded_file($file_temp, $file);
    echo "ファイルのアップロードに成功しました。<br />";
    }
    }// ここに移動しました。
    }
  • id:kyouryukun
    そのやり方を試しましたが、JPEGファイルをあげたのに「JPEGファイルしかできません」とエラーが表示されます。アップロードは成功したのですが・・・。
  • id:a-kuma3
    preg_match の引数は、$filename になってて、UPLOAD_ERR_OK の if の内側は $file_name となってますが、実物はどうなってますか?
  • id:kyouryukun
    指摘通り間違っていました。すいません。
  • id:kyouryukun
    ほかの方にご指摘いただいたのですが、
    上記の正規表現だと「aaaa.jpg.vbs」にも反応してしまうそうです。
    これへの対処法はご存知でしょうか?
  • id:a-kuma3
    最後にドル ($)。

    "/(^[a-zA-Z0-9_-]+)\.(jpe?g)$/i"

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません