CKEditor5图片无法上传怎么办?CKEditor5图片上传PHP接口设计

给老项目换了一下CKEditor5,并使用了官方的CDN,但发现之前的文件上传接口完全不能用了。
看了很多文献,都是需要写JavaScript函数,比较麻烦,就想着看看问题到底出在哪里。
首先把接口进行了如下修改,直接把$_FILES作为返回参数。先看一下是不是上传时候出了问题。

$data = [
	"uploaded" =>1,
	"fileName" => json_encode($_FILES),
	"url" => json_encode($_FILES)
];
echo json_encode($data);

可以看到,编辑器提示图片上传成功了,查看一下图片链接地址:
在这里插入图片描述
%7B%22upload%22:%7B%22name%22:%22u5b6.png%22,%22type%22:%22image//png%22,%22tmp_name%22:%22D://xampp//tmp//php1FD5.tmp%22,%22error%22:0,%22size%22:4357%7D%7D
转码一下:
{“upload”:{“name”:“u5b.png”,“type”:“image//png”,“tmp_name”:“D://xampp//tmp//php1FD5.tmp”,“error”:0,“size”:4357}}
可以看到,$_FILES数组是没有问题的,文件确实是上传到服务器了。
那么问题就是出在接口上了。
从返回参数可以看出,$_FILES包含upload数组,其中包含name、type、tmp_name、error和size五个参数。
可以看出,ck编辑器使用的文件上传变量名是upload。

后来发现是函数报了Notice,而CKEditor只检测是否返回规定的Json,如果有报错信息在Json之前,则无法正确返回。
Notice: A non well formed numeric value encountered in D:\xampp\htdocs\upload.php on line 27
更改了上述问题,上传成功。
在这里插入图片描述

下面是upload.php的代码。

<?php
//返回JSON
if($_POST){
	echo json_encode(upload($_FILES));
}
//上传文件函数
function upload($file){
    //构建上传子目录
    $timeDir = date("Y")."/".date("m")."/".date("d");
    //文件存储位置
    $uploadDir = dirname(__FILE__).'/attachment/'.$timeDir;
    $url =  './attachment/'.$timeDir."/";
    //定义文件名
    $time = date("Ymd") ."_".date("His") . floor(intval(microtime() )* 100);
    //自动创建目录
    if(!is_dir($uploadDir))
    {
        mkdir($uploadDir,0777,true);
    }
    //原文件名
    $fileName = urldecode($file['upload']['name']);
    //上传临时目录文件名
    $tmpName = $file['upload']['tmp_name'];
    //取文件扩展名jpg,gif,bmp,png
    $path_parts = pathinfo($fileName);
    $ext = $path_parts["extension"];
    $ext = strtolower($ext);//jpg,png,gif,bmp
    //只允许上传图片类型的文件
    if($ext == "jpg"
        || $ext == "jpeg"
        || $ext == "png"
        || $ext == "gif"
        || $ext == "bmp")
    {
        //文件名
        $saveFileName = $time . '.' . $ext;
        //保存路径
        $savePath = $uploadDir . "/" . $saveFileName;
        //另存为新文件名称
        if (!move_uploaded_file($tmpName,$savePath))
        {
            exit;
        }
        //构建返回数组
        $data = [
            "uploaded" => true,
            "fileName" => $saveFileName,
            "url" => $url.$saveFileName
        ];
    }

    return $data;
}

编辑器代码如下:

<div id="editor"></div>

<script src="https://cdn.ckeditor.com/ckeditor5/24.0.0/classic/ckeditor.js"></script>
<script src="https://cdn.ckeditor.com/ckeditor5/24.0.0/classic/translations/zh-cn.js"></script>

<script type="module">
    ClassicEditor
        .create( document.querySelector( '#editor' ), {
            language: 'zh-cn',
            ckfinder: {
                uploadUrl: 'upload.php',
            }
        } )
        .then( editor => {
            window.editor = editor;
        } )
        .catch( err => {
            console.error( err.stack );
        } );


</script>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
首先,你需要安装 `@ckeditor/ckeditor5-vue` 和 `@ckeditor/ckeditor5-build-classic` 两个依赖包。 ``` npm install --save @ckeditor/ckeditor5-vue @ckeditor/ckeditor5-build-classic ``` 然后在你的 Vue 组件中引入 CKEditor 组件: ```vue <template> <div> <ckeditor :editor="editor" v-model="content" :config="editorConfig"></ckeditor> </div> </template> <script> import ClassicEditor from '@ckeditor/ckeditor5-build-classic' import CKEditor from '@ckeditor/ckeditor5-vue' export default { components: { ckeditor: CKEditor.component }, data() { return { content: '', editorConfig: { // 配置项 }, editor: ClassicEditor } } } </script> ``` 在上面的代码中,我们引入了 `ClassicEditor`,它是一个预先配置好的编辑器,包含了常用的插件,如加粗、斜体、链接等。我们也可以自定义 `editorConfig`,来配置编辑器。 下面是一个常用的配置项示例: ```js editorConfig: { toolbar: { items: [ 'bold', 'italic', 'link', '|', 'bulletedList', 'numberedList', '|', 'imageUpload', 'blockQuote', 'insertTable', 'undo', 'redo' ] }, image: { toolbar: [ 'imageTextAlternative', '|', 'imageStyle:full', 'imageStyle:side', '|', 'imageResize', '|', 'imageUpload', 'imageUpload', 'imageUpload', 'imageUpload' ], styles: [ 'full', 'side' ] }, language: 'zh-cn', table: { contentToolbar: [ 'tableColumn', 'tableRow', 'mergeTableCells', 'tableCellProperties', 'tableProperties' ] }, licenseKey: '', simpleUpload: { uploadUrl: '/your/upload/url', headers: { 'X-CSRF-TOKEN': 'CSRF-Token' } } } ``` 上面的配置中,我们开启了图片上传功能,并且添加了表格插入、图片上传、撤销、重做等常用功能。同时也设置了语言为中文。 如果需要添加额外的插件,可以使用 `@ckeditor/ckeditor5-*` 的包名,比如添加字数统计插件: ``` npm install --save @ckeditor/ckeditor5-word-count ``` 然后在 `editorConfig` 中添加: ```js import WordCount from '@ckeditor/ckeditor5-word-count/src/wordcount'; editorConfig: { plugins: [WordCount], toolbar: [ 'wordCount' ] } ``` 这样就可以在编辑器中添加字数统计功能了。 我们也可以自定义上传图片的方法,需要在配置项中添加 `simpleUpload` 选项: ```js editorConfig: { simpleUpload: { uploadUrl: '/your/upload/url', headers: { 'X-CSRF-TOKEN': 'CSRF-Token' }, // 自定义上传方法 async upload(file) { // 这里写上传逻辑 const formData = new FormData(); formData.append('file', file); const response = await axios.post('/your/upload/url', formData, { headers: { 'Content-Type': 'multipart/form-data', 'X-CSRF-TOKEN': 'CSRF-Token' } }); return { default: response.data.url }; } } } ``` 在上面的代码中,我们使用了 axios 发送了一个 `multipart/form-data` 的请求,然后返回上传图片地址。 希望以上内容能够帮到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Evaporator Core

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值