Como subir imágenes con CKEditor 4 y Laravel 8

Para que salga la opción de subir imágenes se tiene que especificar una ruta en la configuración, sino, no te sale la pestaña con esa opción:

CKEDITOR.replace( '{{$id}}', {
    language: '{{app()->getLocale()}}',
    filebrowserUploadUrl: '/upload',

Como Laravel incluye, correctamente, protección CSRF, debemos añadirla a la petición de subida ampliando la configuración del CKEditor:

CKEDITOR.replace( '{{$id}}', {
    language: '{{app()->getLocale()}}',
    filebrowserUploadUrl: '/upload',
    fileTools_requestHeaders: {
        'X-Requested-With': 'XMLHttpRequest',
        'X-CSRF-TOKEN': '{{ csrf_token() }}'
    }
}

Luego ya solo tienes que incluir la ruta y crear el controlador para almacenar la imagen. Teniendo en cuenta eso si la respuesta que espera CKEDitor

use URL;
class UploadController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function upload(Request $request, $language) {
        $validator = Validator::make($request->all(), [
            'upload' => 'required|image|mimes:jpeg,png,jpg'
        ]);

        if ($validator->fails()) {
            return response()->json([
                'error' => [
                    'message' => $validator->errors()->first()
                ]
            ], 422);
        }

        $filename = time().'.'.$request->upload->extension();
        $request->upload->move(public_path('upload'), $filename);
            return response()->json([
                'uploaded' => 1,
                'fileName' => $request->upload->getClientOriginalName(),
                'url' => URL::asset('upload/'.$filename)
            ]);
    }
}

Por cierto, si hay errores en la subida (cualquier validación que incluyas) ckeditor espera esta estructura anterior para mostrar el mensaje que quieras. Nosotros usamos el primero, pues solo hay un campo.

También puedes ver como hacer la galería aquí