<?php if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])){ // 各ファイルをチェック foreach ($_FILES['upfile']['error'] as $k => $error){ try { if (!is_int($error)){ throw new RuntimeException("[{$k}] パラメータが不正です"); } // $_FILES['upfile']['error']の値を確認 switch ($_FILES['upfile']['error']){ case UPLOAD_ERR_OK: break; case UPLOAD_ERR_NO_FILE: throw new RuntimeException('ファイルが選択されていません'); case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過 throw new RuntimeException('ファイルサイズが大きすぎます'); default: throw new RuntimeException('その他のエラーが発生しました'); } // $_FILES['upfile']['mime']の値はブラウザ側で偽装可能なので // MIMEタイプを自前でチェックする if (!$info @getimagesize($_FILES['upfile']['tmp_name'][$k])){ throw new RuntimeException("[{$k}] 有効な画像ファイルを指定してください"); } if (!in_array($info[2], [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG], true)){ throw new RuntimeException("[{$k}] 未対応の画像形式です"); } // 画像処理に使う関数名を決定する $create = str_replace('/', 'createfrom', $info['mime']); $output = str_replace('/', '', $info['mime']); // 縦横比を維持したまま、120*120 以下に収まるサイズを求める if ($info[0] >= $info[1]){ $dst_w = 120; $dst_h = ceil(120 * $info[1] / max($info[0], 1)); } else { $dst_w = ceil(120 * $info[0] / max($info[1], 1)); $dst_h = 120; } // 元画像リソースの生成を試みる if (!$src = @$create($_FILES['upfile']['tmp_name'][$k])){ throw new RuntimeException("[{$k}] 画像リソースの生成に失敗しました"); } // リサンプリング先画像リソースを生成する $dst = imagecreatetruecolor($dst_w, $dst_h); // getimagesize関数で得られた情報も利用してリサンプリングを行う imagecopyresampled($dst, $src, 0, 0, 0, 0, $dst_w, $dst_h, $info[0], $info[1]); // ファイルデータからSHA-1ハッシュを取ってファイル名を決定し、保存する if (!$output( $dst, sprintf('./resized/%s%s', sha1_file($_FILES['upfile']['tmp_name'][$k]), image_type_to_extension($info[2]) ) )) { throw new RuntimeException("[{$k}] ファイル保存時にエラーが発生しました"); } $msgs[] = ['green', "[{$k}] リサイズして保存しました"]; } catch (RuntimeException $e){ $msgs = ['red', $e->getMessage()]; } if (isset($img) && is_resource($img)){ imagedestroy($img); } if (isset($dst) && is_resource($dst)){ imagedestroy($dst); } } } // XTHMLとしてブラウザに認識させる // (IE8以外はサポート対象外) header('Content-Type: application/xhtml+xml; charset=utf-8'); ?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>画像アップロード</title> </head> <body> <?php if (!empty($msgs)): ?> <ul> <?php foreach ($msgs as $msg): ?> <li style="color:<?=$msg[0]?>;"><?= htmlspecialchars($msg[1], ENT_QUOTES, 'UTF-8') ?></li> <?php endforeach; ?> </ul> <?php endif; ?> <form enctype="multipart/form-data" method="post" action=""> <fieldset> <legend>画像ファイルを選択(GIF, JPEG, PNGのみ対応)</legend> <ul> <?php for ($i = 0; $i < 10; $i++): ?> <li><input type="file" name="upfile[]" /></li> <?php endfor; ?> </ul> <input type="submit" value="送信" /> </fieldset> </form> </body> </html>