setReadOnly(); $userID = Session::getUserID(); // 외부 파라미터 // $_FILES['image_upload'] : 사진파일 $defaultImg = 'default.jpg'; $image = $_FILES['image_upload']; $ext = strrchr($image['name'], "."); $size = getImageSize($image['tmp_name']); $imageType = $size[2]; $availableImageType = array('.avif'=>IMAGETYPE_AVIF, '.webp'=>IMAGETYPE_WEBP, '.jpg'=>IMAGETYPE_JPEG, '.png'=>IMAGETYPE_PNG, '.gif'=>IMAGETYPE_GIF); $db = RootDB::db(); $member = $db->queryFirstRow('SELECT `ID`, `PICTURE` FROM `member` WHERE `NO` = %i', $userID); $picName = $member['PICTURE']; $newExt = array_search($imageType, $availableImageType, true); if($picName && strlen($picName) > 11){ $dt = substr($picName, -8); $picName = substr($picName, 0, -10); } else{ $dt = '00000000'; } $rf = date('Ymd'); $response['result'] = false; $response['reason'] = '요청이 올바르지 않습니다!'; if(!is_uploaded_file($image['tmp_name'])) { //진짜 전송된 파일인지 검증 $response['reason'] = '업로드가 되지 않았습니다!'; $response['result'] = false; } elseif(!$newExt) { //확장자 검사 $response['reason'] = 'avif, webp, jpg, gif, png 파일이 아닙니다!'; $response['result'] = false; } elseif($image['size'] > 51200) { //파일크기 검사 $response['reason'] = '50kb 이하로 올려주세요!'; $response['result'] = false; } elseif($size[0] < 64 || 128 < $size[0]) { //이미지크기 검사 $response['reason'] = '64x64 ~ 128x128 사이여야 합니다.'; $response['result'] = false; } elseif($size[0] != $size[1]) { //이미지크기 검사 $response['reason'] = '1:1 비율 이미지여야 합니다.'; $response['result'] = false; }elseif($dt == $rf) { //갱신날짜 검사 $response['reason'] = '1일 1회 변경 가능합니다!'; $response['result'] = false; } else { //이미지 저장 while(true){ $newPicName = bin2hex(random_bytes(4)).$newExt; $dest = AppConf::getUserIconPathFS().'/'.$newPicName; if(file_exists($dest)){ continue; } break; } if (RemoteUserIconUploadClient::isConfiguredEnabled()) { try { $remoteName = bin2hex(random_bytes(16)).$newExt; $contentType = image_type_to_mime_type($imageType); RemoteUserIconUploadClient::uploadConfigured( $remoteName, $contentType, (string)file_get_contents($image['tmp_name']) ); $newPicName = "users/core/{$remoteName}"; $storedRemotely = true; } catch (\Throwable $error) { RemoteUserIconUploadClient::logFailure('user-icon', $error); $storedRemotely = false; } } else { $storedRemotely = null; } if($storedRemotely === false) { $response['reason'] = '원격 이미지 저장소 업로드에 실패했습니다!'; $response['result'] = false; } elseif($storedRemotely === null && !move_uploaded_file($image['tmp_name'], $dest)) { $response['reason'] = '업로드에 실패했습니다!'; $response['result'] = false; } else { $pic = "{$newPicName}?={$rf}"; RootDB::db()->update('member',[ 'PICTURE' => $pic, 'IMGSVR' => $storedRemotely === true ? 0 : 1 ], 'NO=%i', $userID); $servers = []; foreach(ServConfig::getServerList() as $key=>$setting){ if($setting->isRunning()){ $servers[] = [$key, $setting->getKorName()]; } } $response['servers'] = $servers; $response['reason'] = '업로드에 성공했습니다!'; $response['result'] = true; } } Json::die($response);