false, 'message' => 'Method Not Allowed' ]); exit; } if (!isset($_FILES['image'])) { http_response_code(400); echo json_encode([ 'success' => false, 'message' => 'image field required' ]); exit; } $file = $_FILES['image']; if ($file['error'] !== UPLOAD_ERR_OK) { http_response_code(400); echo json_encode([ 'success' => false, 'message' => 'Upload failed', 'error' => $file['error'] ]); exit; } $finfo = new finfo(FILEINFO_MIME_TYPE); $mime = $finfo->file($file['tmp_name']); $allowed = [ 'image/jpeg' => 'jpg', 'image/png' => 'png', 'image/webp' => 'webp', ]; if (!isset($allowed[$mime])) { http_response_code(400); echo json_encode([ 'success' => false, 'message' => 'Invalid image type' ]); exit; } $filename = bin2hex(random_bytes(16)) . '.' . $allowed[$mime]; $destination = $uploadDir . '/' . $filename; if (!move_uploaded_file($file['tmp_name'], $destination)) { http_response_code(500); echo json_encode([ 'success' => false, 'message' => 'Cannot save file' ]); exit; } echo json_encode([ 'success' => true, 'filename' => $filename, 'url' => '/uploads/' . $filename, 'size' => filesize($destination), 'mime' => $mime, ]);