// 画像処理
function uploadImg($file, $key){
debug('画像アップロード処理開始');
debug('FILE情報:'.print_r($file,true));
if (isset($file['error']) && is_int($file['error'])) {
try {
// バリデーション
// $file['error'] の値を確認。配列内には「UPLOAD_ERR_OK」などの定数が入っている。
//「UPLOAD_ERR_OK」などの定数はphpでファイルアップロード時に自動的に定義される。定数には値として0や1などの数値が入っている。
switch ($file['error']) {
case UPLOAD_ERR_OK: // OK
break;
case UPLOAD_ERR_NO_FILE: // ファイル未選択の場合
throw new RuntimeException('ファイルが選択されていません');
case UPLOAD_ERR_INI_SIZE: // php.ini定義の最大サイズが超過した場合
case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過した場合
throw new RuntimeException('ファイルサイズが大きすぎます');
default: // その他の場合
throw new RuntimeException('その他のエラーが発生しました');
}
// $file['mime']の値はブラウザ側で偽装可能なので、MIMEタイプを自前でチェックする
// exif_imagetype関数は「IMAGETYPE_GIF」「IMAGETYPE_JPEG」などの定数を返す
$type = @exif_imagetype($file['tmp_name']);
if (!in_array($type, [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG], true)) { // 第三引数にはtrueを設定すると厳密にチェックしてくれるので必ずつける
throw new RuntimeException('画像形式が未対応です');
}
// ファイルデータからSHA-1ハッシュを取ってファイル名を決定し、ファイルを保存する
// ハッシュ化しておかないとアップロードされたファイル名そのままで保存してしまうと同じファイル名がアップロードされる可能性があり、
// DBにパスを保存した場合、どっちの画像のパスなのか判断つかなくなってしまう
// image_type_to_extension関数はファイルの拡張子を取得するもの
$path = 'uploads/'.sha1_file($file['tmp_name']).image_type_to_extension($type);
if (!move_uploaded_file($file['tmp_name'], $path)) { //ファイルを移動する
throw new RuntimeException('ファイル保存時にエラーが発生しました');
}
// 保存したファイルパスのパーミッション(権限)を変更する
chmod($path, 0644);
debug('ファイルは正常にアップロードされました');
debug('ファイルパス:'.$path);
return $path;
} catch (RuntimeException $e) {
debug($e->getMessage());
global $err_msg;
$err_msg[$key] = $e->getMessage();
}
}
}
目次
コメント