画像のアップロード処理
PHPで画像のアップロード処理を紹介してるサイトは、ネット上にも色々見つかりますが、if文が入れ子になり過ぎて読み辛いもの、理解し辛いものが多いです。
そこで自分なりに解説してみます。
まずは簡単なアップロード用サンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php $tmp_name = $_FILES['img_name']['tmp_name']; $img_name = './' . $_FILES['img_name']['name']; if (is_uploaded_file($tmp_name)) { if (move_uploaded_file($tmp_name , $img_name) === TRUE) { echo $img_name . 'をアップロードしました。'; } else { echo 'ファイルをアップロードできません。'; } } else { echo 'ファイルが選択されていません。'; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>アップロード</title> </head> <body> <form method="post" enctype="multipart/form-data"> <input type="file" name="img_name"> <input type="submit" value="アップロード"> </form> </body> </html> |
【Tips】
スーパーグローバル変数の$_FILESの詳細はこちら
ただ、これだとエラーメッセージの表示がHTML以外の処で表示されますので、エラーメッセージ用の配列を使い、HTML側で表示するように追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php $err_msg = array(); $tmp_name = $_FILES['img_name']['tmp_name']; $img_name = './' . $_FILES['img_name']['name']; if (is_uploaded_file($tmp_name)) { if (move_uploaded_file($tmp_name , $img_name) === TRUE) { $err_msg[] = $img_name . 'をアップロードしました。'; } else { $err_msg[] = 'ファイルをアップロードできません。'; } } else { $err_msg[] = 'ファイルが選択されていません。'; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>アップロード</title> </head> <body> <?php if (count($err_msg) > 0) { ?> <ul> <?php foreach ($err_msg as $value) { ?> <li><?php print $value; ?></li> <?php } ?> </ul> <?php } ?> <form method="post" enctype="multipart/form-data"> <input type="file" name="img_name"> <input type="submit" value="アップロード"> </form> </body> </html> |
このままだと、どんなファイルも受け付けてしまったり、エラーチェックが甘いので、次のようなエラーチェックを追記します。
- アップロード項目が存在するかどうかチェック
- 画像が選択されているかチェック
- アップロードされたファイルかどうかのチェック
- ファイル名が正しいかどうかの正規表現チェック
- ファイルのMIMEタイプが画像であるかチェック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
<?php $message = array(); $err_msg = array(); $new_img = ''; if (isset($_FILES["new_img"]) === TRUE) { $img_name = $_FILES['new_img']['name']; $tmp_name = $_FILES['new_img']['tmp_name']; $ext_str = '(gif|png|jpg|jpeg)'; $pattern = '/^[a-z0-9A-Z\-_]+\.' . $ext_str . '$/'; if($img_name === ''){ $err_msg[] = '画像を選択してください。'; } else if (is_uploaded_file($tmp_name) !== TRUE) { $err_msg[] = "アップロードファイルではありません。"; } else if (preg_match('/\.' . $ext_str . '$/', $img_name) !== 1) { $err_msg[] = "拡張子はgif、png、jpg、jpegのみ可能です。"; } else if(!preg_match($pattern, $img_name) !== 1){ $err_msg[] = "ファイル名が正しくありません。"; } else { $finfo = new finfo(FILEINFO_MIME_TYPE); $mime_type = $finfo->file($tmp_name);//MIMEタイプの取得 $extension_array = array( 'gif' => 'image/gif', 'jpg' => 'image/jpeg', 'png' => 'image/png' ); $img_ext = array_search($mime_type, $extension_array, true);//MIMEタイプから拡張子を出力 if (preg_match('/^' . $ext_str . '$/', $img_ext) !== 1) { $err_msg[] = "画像はgif、png、jpgのみ可能です。"; } else { if (move_uploaded_file($tmp_name , $img_name) === TRUE) { $message[] = $img_name . 'をアップロードしました。'; } else { $err_msg[] = 'ファイルをアップロードできません。'; } } } } else { $err_msg[] = '画像を入力してください。'; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>アップロード</title> </head> <body> <?php if (count($message) > 0) { ?> <ul> <?php foreach ($message as $value) { ?> <li><?php print $value; ?></li> <?php } ?> </ul> <?php } ?> <?php if (count($err_msg) > 0) { ?> <ul> <?php foreach ($err_msg as $value) { ?> <li><?php print $value; ?></li> <?php } ?> </ul> <?php } ?> <form method="post" enctype="multipart/form-data"> <input type="file" name="img_name"> <input type="submit" value="アップロード"> </form> </body> </html> |