這篇文章會一步步實作 CKEditor 在 CodeIgniter 中圖片以及檔案上傳到 server 的功能,首先我們前往 CKEditor 官網下載最新的版本,這個 demo 使用的是 4.6,存檔後我會放在 assets/ckeditor/
下,我會使用 Sybio/ImageWorkshop 這個套件對圖片做第一次的壓縮,我們通常不希望 user 存超大的東西在我們這啦,畢竟不是相簿,前台可以順利顯示為準則。
assets/ckeditor/config.js
CKEDITOR.editorConfig = function( config ) { config.toolbar = [ {name:'document', items:['Source','-','Preview','Print']}, {name:'clipboard', items:['Cut','Copy','Paste','PasteText','PasteFromWord','-','Undo','Redo']}, {name:'basicstyles', items:['Bold','Italic','Underline','Strike','Subscript','Superscript','-','RemoveFormat']}, '/', {name:'paragraph', items:['NumberedList','BulletedList','-','Outdent','Indent','-','Blockquote','-','JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock','-','BidiLtr','BidiRtl']}, {name:'links', items:['Link','Unlink']}, {name:'insert', items:['Image','Table']}, {name:'tools', items:['Maximize']} ]; config.enterMode = CKEDITOR.ENTER_BR; config.filebrowserImageUploadUrl = baseUrl + 'ckeditor/image_upload'; config.filebrowserUploadUrl = baseUrl + 'ckeditor/file_upload'; };
這是我常用的 config,工具可以自行增減。
application/views/ckeditor.php
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>CKEditor Upload Demo</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <script src="assets/ckeditor/ckeditor.js"></script> <script src="assets/ckeditor/adapters/jquery.js"></script> <script type="text/javascript" charset="utf-8"> var baseUrl = "<?php echo base_url(); ?>"; window.CKEDITOR_BASEPATH = "<?php echo base_url('assets/ckeditor'); ?>"; $(function() { $('.ckeditor').ckeditor(); }); </script> </head> <body> <?php echo form_open_multipart('ckeditor/upload'); ?> <?php echo form_textarea(['name' => 'content', 'class' => 'ckeditor']); ?> <?php echo form_submit('submit', '上傳'); ?> <?php echo form_close(); ?> </body> </html>
簡單的設定一下 ckeditor 必要的環境。
application/controllers/Ckeditor.php
<?php defined('BASEPATH') or exit('No direct script access allowed'); use PHPImageWorkshop\ImageWorkshop; class Ckeditor extends CI_Controller { /** * Upload path. * * @var string */ private $path = 'assets/uploads/ckeditor/'; /** * Index page. */ public function index() { $this->load->helper('form'); $this->load->helper('url'); $this->load->view('ckeditor'); } /** * CKEditor image upload * * Upload by ImageWorkshop package * * @return string */ public function image_upload() { $this->load->helper('url'); $funcNum = $this->input->get('CKEditorFuncNum'); $source = $_FILES['upload']['tmp_name']; $file = $_FILES['upload']['name']; $ext = pathinfo($file, PATHINFO_EXTENSION); $ratio = 1200; // 寬度最大比例 $allows = [1, 2, 3]; // GIF, JPEG, PNG $newName = date('YmdHis').rand(1000, 9999); //新檔名 $message = ''; $url = ''; try { $exif = exif_imagetype($source); if (!$exif) { throw new Exception('檔案格式錯誤'); } if (!in_array($exif, $allows)) { throw new Exception('僅允許 gif, jpeg, png'); } $imageInfo = getimagesize($source); $layer = ImageWorkshop::initFromPath($source); // 若寬度大於比例,縮放置比例 if ($imageInfo[0] > $ratio) { $layer->resizeInPixel($ratio, null, true); } $fileName = "{$newName}.{$ext}"; $layer->save($this->path, $fileName); $url = base_url($this->path.$fileName); } catch (Exception $e) { $message = $e->getMessage(); } $string = "<script type=\"text/javascript\">window.parent.CKEDITOR.tools.callFunction({$funcNum}, '{$url}', '{$message}');</script>"; $this->output ->set_content_type('text/html') ->set_output($string); } /** * CKEditor image upload * * @return string */ public function file_upload() { $this->load->helper('url'); $funcNum = $this->input->get('CKEditorFuncNum'); $source = $_FILES['upload']['tmp_name']; $file = $_FILES['upload']['name']; $ext = pathinfo($file, PATHINFO_EXTENSION); $newName = date('YmdHis').rand(1000, 9999); //新檔名 $message = ''; $url = ''; try { $fileName = "{$newName}.{$ext}"; $target = $this->path.$fileName; if (move_uploaded_file($source, $target)) { $url = base_url($target); } else { $message = '上傳失敗'; } } catch (Exception $e) { $message = $e->getMessage(); } $string = "<script type=\"text/javascript\">window.parent.CKEDITOR.tools.callFunction({$funcNum}, '{$url}', '{$message}');</script>"; $this->output ->set_content_type('text/html') ->set_output($string); } }
我們建立了 Ckeditor 的 controller,把 form 放在首頁,這個部份包含了圖片跟檔案上傳的程式碼,圖片部份也包含了檔案格式檢查、檔案尺寸檢查,如果還需要檢查更多的東西就在 try catch 裡面再加。