is_int
Find whether the type of a variable is integer
$_FILES[”][‘error’]
PHP returns an appropriate error code along with the file array. The error code can be found in the error segment of the file array that is created during the file upload by PHP.
UPLOAD_ERR_OK, UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_FORM_SIZE, UPLOAD_ERR_PARTIAL, UPLOAD_ERR_NO_FILE, UPLOAD_ERR_NO_TMP_DIR, UPLOAD_ERR_CANT_WRITE, UPLOAD_ERR_EXTENSION
exif_imagetype
Determine the type of an image
IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG
sprintf
Return a formatted string
image_type_to_extension
Get file extension for image type
<?php if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])){ try { // $_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タイプを自前でチェック $type = @exif_imagetype($_FILES['upfile']['tmp_name']); if(!in_array($type, [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG], true)) { throw new RuntimeException('画像形式が未対応です'); } // ファイルデータからSHA-1ハッシュを取ってファイル名を決定し、ファイルを保存する $path = sprintf('./img/%s%s', sha1_file($_FILES['upfile']['tmp_name']), image_type_to_extension($type)); if (!move_uploaded_file($_FILES['upfile']['tmp_name'], $path)){ throw new RuntimeException('ファイル保存時にエラーが発生しました'); } chmod($path, 0644); $msg = ['green', 'ファイルは正常にアップロードされました']; } catch (RuntimeException $e){ $msg = ['red', $e->getMessage()]; } } // 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 (isset($msg)): ?> <fieldset> <legend>結果</legend> <span style="color:<?=$msg[0]?>;"><?=$msg[1]?></span> </fieldset> <?php endif; ?> <form enctype="multipart/form-data" method="post" action=""> <fieldset> <legend>画像ファイルを選択(GIF, JPEG, PNGのみ対応)</legend> <input type="file" name="upfile" /><br /> <input type="submit" value="送信" /> </fieldset> </form> </body> </html>