Cara Mudah Upload Gambar Dengan Tiny MCE Pada Laravel

1. Menambahkan Depedency Tiny MCE

Di sini kita perlu menambahkan depedency Tiny MCE contoh dengan cdn pada layout pada berikut.

<script src="https://cdn.tiny.cloud/1/API_KEY_HERE/tinymce/5/tinymce.min.js" referrerpolicy="origin">

2. Menambahkan Script Pada View

Pada langkah ini menambahkan script pada view untuk menampilkan text editor.

Selector yang akan di load.

<textarea class="form-control" id="body" name="body" ></textarea>

Kemudian tambahkan script.

<script>
    tinymce.init({
        selector: '#body',
        plugins: 'lists link image media code',
        toolbar: 'undo redo | styleselect | forecolor | bold italic | alignleft aligncenter alignright alignjustify | outdent indent | link image | code',
        file_picker_types: 'image',
        images_upload_handler: function (blobInfo, success, failure) {
            let data = new FormData();
            data.append('file', blobInfo.blob(), blobInfo.filename());
            data.append('_token', document.getElementsByName("_token")[0].value);
            axios.post("/file/upload", data).then(function (res) {
                success(res.data.location);
            }).catch(function (err) {
                failure('HTTP Error: ' + err.message);
            });
        },
        file_picker_callback: function(cb, value, meta) {
            var input = document.createElement('input');
            input.setAttribute('type', 'file');
            input.setAttribute('accept', 'image/*');
            input.onchange = function() {
                var file = this.files[0];
                var reader = new FileReader();
                reader.readAsDataURL(file);
                reader.onload = function () {
                    var id = 'blobid' + (new Date()).getTime();
                    var blobCache =  tinymce.activeEditor.editorUpload.blobCache;
                    var base64 = reader.result.split(',')[1];
                    var blobInfo = blobCache.create(id, file, base64);
                    blobCache.add(blobInfo);
                    cb(blobInfo.blobUri(), { title: file.name });
                };
            };
            input.click();
        }
    });
</script>

3. Membuat Fungsi Upload Pada Controller

Pada langkah ini kita akan membuat fungsi upload untuk menyimpan gambar pada storage.

Pada Route.

Route::post('file/upload', [FileController::class, 'upload'])->name('file.upload');

Pada Controller.

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;

class FileController extends Controller
{

    /**
    * Handle file upload and return location.
    *
    * @param  Illuminate\Http\Request  $request
    * @return \Illuminate\Http\Response
    */
    public function upload(Request $request)
    {
        $this->validate($request, [ 'file' => 'required|image' ]);
        
        $filename = $request->file->getClientOriginalName();
        $location = url('storage/upload-image/' . $filename);
        
        try {
            $request->file->storeAs('public/upload-image', $filename);
        } catch (Exception $e) {
            return abort(500, 'Invalid upload image.');
        }
        
        return response()->json([ 'location' => $location ]);
    }
}

Catatan

Pada upload di storage jika kita gunakan default tanpa nama file bisa gunakan :

$location = $request->file->storePublicly('upload-image', 'public');

Jika ingin disabled pada tiny bisa lakukan seperti di bawah ini.

tinyMCE.init({
    selector: '#form-content-readonly',
    readonly : 1
});
tinymce.activeEditor.getBody().setAttribute('contenteditable', false);

Sekian untuk kali ini semoga bermanfaat :D untuk lebih lanjut bisa kunjungi link tersebut.