画像のアップロード処理
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>  | 
					
