CKEditor5文件上传

悲报:这是我第二次编辑这篇文章了,第一次因为ckeditor提供的特殊字符编码长度为3~4byte,不受数据库支持,没有保存上(已经解决了,以后还是用系统自带的特殊字符吧,不会是什么奇奇怪怪的编码)

起初我配置的编辑器为CKEditor4,因为其已经发布七八年了,已经非常成熟。但是现在我更喜欢使用Markdown语法编辑文章,且CKEditor4的编辑器样式、功能已经较为落后,所以最终决定更改为功能更强、支持Markdown语法的CKEditor5编辑器。

ckeditor5改为了在线构建CKEditor 5 Online Builder | Create your own editor in 5 steps。根据需求选择插件就可构建出以/build/ckeditor.js为核心的编辑器。在编辑器构建过程中,有以下几点需要注意:

1.Markdown插件,实现的是Markdown格式输出,而不是Markdown语法的支持。ckeditor5原生支持Markdown语法,除非有特殊用途,不然不建议勾选此插件;(Markdown插件会使得可用的功能变得十分稀少);

2.插件中的Document listDocument list properties不可用,勾选后会导致ckeditor.js无法运行

根据官方文档Overview - CKEditor 5 Documentation,ckeditor5提供了以下几种图片上传插件:CKBox file manager - CKEditor 5 DocumentationEasy Image - CKEditor 5 DocumentationCKFinder file manager - CKEditor 5 DocumentationBase64 upload adapter - CKEditor 5 DocumentationSimple upload adapter - CKEditor 5 Documentation。其中Simple upload adapterBase64 upload adapter、CKFinder的依赖插件CKFinder upload adapter是免费的,此处选择CKFinder upload adapter。

选择了CKFinder upload adapter插件,还需要在ckeditor5的config文件中添加配置,指定文件上传链接。在config的"toolbar": {"items": [  ],},之后添加如下配置:

"ckfinder": {
    "uploadUrl": '/uploads/'#'/uploads/'为我的图片上传地址,需根据实际情况改动
},

前端配置完毕,就需要在后端实现文件上传,并返回上传的文件信息。(返回的json格式需参照官方文档)后端实现如下:

import os
import uuid
import datetime

from django.contrib.auth.decorators import login_required

from django.http import JsonResponse
from django.conf import settings


@login_required(login_url='/userprofile/login/')

def upload_file(request):
    # 获取表单上传的图片
    upload = request.FILES.get('upload')
    now = datetime.datetime.now()
    # 返回uid
    uid0 = ''.join(str(uuid.uuid4()).split('-'))
    uid = str(request.user.id) + now.strftime("__%Y-%m-%d_%H-%M-%S__") + uid0
    # 修改图片名称
    names = str(upload.name).split('.')
    names[0] = uid
    # 返回修改过的图片格式
    upload.name = '.'.join(names)
    new_path = os.path.join(settings.MEDIA_ROOT, 'upload/', upload.name)
    # 上传图片
    with open(new_path, 'wb+') as file:
        for chunk in upload.chunks():
            file.write(chunk)

    # 构造要求的数据格式并返回
    filename = upload.name
    url = '/media/upload/' + filename
    return_data = {'url': url,
                   'uploaded': '1',
                   'fileName': filename}
    return JsonResponse(return_data)

最后需要在urls中添加路由。



登录后回复

共有1条评论


test

测试消息

2022-11-14 17:11 回复

目 录