杰克工作室 发表于 2023-2-23 16:35

ckeditor4.x添加插件 - 上传剪切板中的图片 - 非网上流传[iz7z8.net开发] - 亲测可用

<p>由于经常写博客,而且还要上传一些图片,特别是截图的图片要先保存到电脑上,然后再上传到服务器,太麻烦。为了提高生产力,就写了&ldquo;粘贴剪切板中的图片&rdquo;。</p>

<p>我们先来理一下思路:</p>

<p>第1步、先用截图工具截图</p>

<p>第2步、JS读取剪切板中的图片,并使用base64格式显示图片</p>

<p>第3步、JS将base64图片POST到PHP上,保存,并返回图片在服务器上的地址。</p>

<p>&nbsp;</p>

<p>好,开始:</p>

<p>第1步:修改ckeditor4的配置文件,config.js,使之加载我们写好的插件:</p>

<pre>
    var extraPlugins    = config.extraPlugins;
    config.extraPlugins = extraPlugins+ &#39;,imagepaste&#39;;//imagepaste粘贴剪切板插件

    config.allowedContent = true;
    config.fullPage = true;

    config.imagepasteUrl   = &#39;/admin.php/admin/misc/imagepaste&#39;;</pre>

<p>第2步:在ckeditor/plugins/目录创建目录imagepaste,在目录 ckeditor/plugins/imagepaste/下创建文件plugin.js:内容如下:</p>

<pre>
CKEDITOR.plugins.add( &#39;imagepaste&#39;,
{
    init : function( editor )
    {
      function uploadbase64( base64body ) {
            var imageUrl = &#39;&#39;;
            var url= editor.config.imagepasteUrl;
            url= url + (url.indexOf(&quot;?&quot;) == -1? &quot;?&quot; : &quot;&amp;&quot;);
            url += &#39;CKEditor=&#39; + editor.name + &#39;&amp;CKEditorFuncNum=2&amp;langCode=&#39; + editor.langCode;

            jQuery.ajax({
                url: url,
                data : {&#39;base64img&#39;:&#39;imagepaste&#39;, &#39;data&#39;:base64body},
                type : &#39;POST&#39;,
                async : false,
                dataType : &#39;json&#39;,
                cache : false,
                success : function(ret){
                  imageUrl = ret[&#39;data&#39;];
                }
            });
            return imageUrl;
      }

      var fckid = editor[&#39;name&#39;];
      // Paste from clipboard:
      CKEDITOR.instances.on(&#39;instanceReady&#39;, function(e) {
            this.document.on(&quot;paste&quot;, function(e) {
                var items = e.data.$.clipboardData.items;
                for(var i = 0; i &lt; items.length; ++i) {
                  var item = items;
                  if(item.kind == &#39;file&#39; &amp;&amp; item.type == &#39;image/png&#39;) {
                        var imgFile = item.getAsFile();
                        if(!imgFile) {
                            return true;
                        }
                        var reader = new FileReader();
                        reader.readAsDataURL(imgFile);
                        reader.onload = function(e) {
                            //显示文件
                            //CKEDITOR.instances.insertHtml(&#39;&lt;img alt=&quot;&quot; src=&quot;&#39; + this.result + &#39;&quot; /&gt;&#39;);//显示base64图片
                            var src = uploadbase64(this.result);
                            CKEDITOR.instances.insertHtml(&#39;&lt;img alt=&quot;&quot; src=&quot;&#39; + src + &#39;&quot; /&gt;&#39;);//替换base64图片为服务器地址
                        }
                        return false;
                  }
                }
            });
      });
         return true;
    }
}
);</pre>

<p>第3步:上传base64图片:config.imagepasteUrl &nbsp; = &#39;/admin.php/admin/misc/imagepaste&#39;;&nbsp; 注意,这里的地址可以根据你的需求自定义,未必要和我的地址一样。</p>

<pre>
    public function imagepaste()
    {
      $from_type= input(&#39;base64img&#39;);
      $from_type= $from_type ?:&#39;imagepaste&#39;;//这里的$from_type用于标示是哪里来的base64图片,你也可以设置此值为空
      $base64_img = input(&#39;data&#39;);
      preg_match(&#39;/^(data:\s*image\/(\w+);base64,)/&#39;, $base64_img, $result);

      if(empty($result)){
            ajaxOut(400, &#39;文件错误&#39;);
      }

      $type = $result;

      if(!in_array($type, array(&#39;pjpeg&#39;,&#39;jpeg&#39;,&#39;jpg&#39;,&#39;gif&#39;,&#39;bmp&#39;,&#39;png&#39;))){
            ajaxOut(400, &#39;图片上传类型错误&#39;);
      }

      $filename = $from_type . &#39;_&#39;. date(&#39;Y-m-d_H-i-s&#39;, time()) . &#39;_&#39; . mt_rand(0,1000) . &#39;.&#39; . $type;
      $file_dir = config(&#39;upload_path&#39;) . DS . &#39;images/&#39; . date(&#39;Ymd&#39;) . &#39;/&#39;;
      if(!is_dir($file_dir)){
            mkdir($file_dir, 0755, true);
      }
      $absolute_path = $file_dir . $filename;
      $image_body    = str_replace($result, &#39;&#39;, $base64_img);
      if(file_put_contents($absolute_path, base64_decode($image_body))){
            $img_ret      = str_ireplace(config(&#39;upload_path&#39;) . DS , &#39;&#39;, $absolute_path);
            $img_ret      = &#39;/uploads/&#39; . $img_ret;
            ajaxOut(200, $img_ret);
      }else{
            ajaxOut(400, &#39;图片上传失败&#39;);
      }

    }</pre>

<p>第4步:大功告成。</p>

<p><img alt="" src="data/attachment/forum/202302/23/2023-02-23_16-35-42_707.png" /></p>

<p>请右键查看图片名称。</p>

杰克工作室 发表于 2023-6-22 15:12

注:发现ckeditor4.19.x已经集成了此功能,所以高版本的ckeditor使用者无须理会此插件。
页: [1]
查看完整版本: ckeditor4.x添加插件 - 上传剪切板中的图片 - 非网上流传[iz7z8.net开发] - 亲测可用