其實
CKSource Docs網站上的文件寫的很清楚,但怕忘記,所以做個記錄。
- CKEditor:3.3.2 (備份下載點)
授權分兩種,商業用途要付費。
CKEditor主要用途在「編輯」文件上,讓你可以更快速、更靈活的來進行編輯工作。
- CKFinder:2.0 (備份下載點)
目前提供的為「測試版」,在使用時會不斷顯示「這是Demo版本…」的訊息,不過功能不受影響,可以完整使用。
CKFinder主要用途在「檔案管理」,你可以透過CKFinder直接上傳檔案到伺服器上,然後進行管理,而且CKFinder可以與CKEditor進行整合,也就是在CKEditor就可以進行上傳檔案及其他CKFinder的功能。
目前CKFinder有分多個應用版本,因為我們以ASP.NET為主,所以請下載for asp.net的程式檔。
目前CKEditor及CKFinder的版本更新速度不算慢,如果你是用不同版本在實作,還是請參考原廠的說明為主。
以下分三個部份
- ASP.NET + CKEditor實作
- ASP.NET + CKFinder實作
- 整合CKEditor與CKFinder
ASP.NET + CKEditor教學實作
如果你還在使用舊版本FCKeditor,最好更新上來使用新版的CKEditor,因為FCKeditor本身設計及設定上有
漏洞,例如
x坤的這條新聞,所以良心建議,當你使用此類的Open Source時,要時時注意更新訊息,訂個RSS也好,當有更新時看一下是為什麼更新,如果是因為安全性問題而做的更新,那最好順便更新一下,等到出事就來不及。
- 下載CKEditor原始檔,我下載的是3.3.2版,解壓縮,然後將ckeditor目錄複製或拉進Vistual Studio專案根目錄裡;(裡面有兩個目錄_samples、_source,學習可以留著看,正式上線就不要留了)
- 在*.aspx裡引用ckeditor.js指令碼,例如:
1 | <script src= "ckeditor/ckeditor.js" type= "text/javascript" > </script> |
- 放入一個Textbox控制項,有幾個重點:
ID:ckdata
TextMode:MultiLine
Rows:10
Columns:80
ClientIDMode:Static (.NET Framework 4)
- 在控制項下方撰寫Javascript指令碼
1 | <script type= "text/javascript" > |
2 | CKEDITOR.replace( '<%= ckdata.ClientID %>' , {skin : 'kama' }); |
這裡主要是把Textbox的ID帶給CKEditor來使用,CKEditor才知道要把那一個Textbox變成「編輯區」。而最後{...}裡是主要細項設定的地方,可以用來改變CKEditor,例如skin是用來改變外觀,其他細部設定,請參考CKEditor 3.x - Developers Guide中Configuration一節。
另外,請務必把此段Javascript放到Textbox控制項的下方,如果放在head裡,會沒有效果。
 |
IntelliSense |
在撰寫Javascript的過程,IntelliSense會自己提示相關方法等,
就甘心啦!
最後完成的程式碼為:
2 | <asp:TextBox ID= "ckdata" runat= "server" TextMode= "MultiLine" Rows= "10" |
3 | Columns= "80" ClientIDMode= "Static" ></asp:TextBox> |
4 | <script type= "text/javascript" > |
然後執行網頁:
 |
CKEditor介面 |
接下來,我們在畫面上放一個Button控制項及Lable控制項,我們要把Textbox的值取出來。
02 | <asp:TextBox ID= "ckdata" runat= "server" TextMode= "MultiLine" Rows= "10" |
03 | Columns= "80" ClientIDMode= "Static" ></asp:TextBox> |
04 | <script type= "text/javascript" > |
08 | <asp:Button ID= "SendData" runat= "server" Text= "Button" /> |
09 | <asp:Label ID= "Label1" runat= "server" Text= "Label" ></asp:Label> |
13 | Protected Sub SendData_Click( ByVal sender As Object , ByVal e As System.EventArgs) Handles SendData.Click |
14 | Me .Label1.Text = Me .ckdata.Text |
執行後,隨便輸入一些文字,然後送出!!!
 |
錯誤訊息 |
ASP.NET本身不許包含有html標籤的資料內容,必須取消驗證,在錯誤訊息裡有提供解決辦法。在.NET Framework 4.0裡需要兩個步驟:
- 在開頭宣告裡加上屬性validateRequest="false";
- 在web.config裡新增httpRuntime標籤
1 | <%@ Page Language= "VB" AutoEventWireup= "false" CodeFile= "DemoCKEditor.aspx.vb" Inherits = "DemoCKEditor" ValidateRequest= "false" %> |
5 | <compilation debug= "false" strict= "false" explicit= "true" targetFramework= "4.0" /> |
6 | <httpRuntime requestValidationMode = "2.0" /> |
在.NET Framwork 3.5 SP1之前,只需要步驟1即可。
再為Button加上一些保護:
2 | Protected Sub SendData_Click( ByVal sender As Object , ByVal e As System.EventArgs) Handles SendData.Click |
3 | Me .Label1.Text = HttpUtility.HtmlEncode( Me .ckdata.Text) |
非常建議所有只要是「人工
輸入」的內容都使用HttpUtility.HtmlEncode方法加以保護。
 |
取得Textbox控制項的值 |
基本上到這裡就已經差不多了,其他的細節就都必須由第二個參數{…}去調整。最後來看一張圖:
 |
影像屬性 |
在最後面CKEditor與CKFinder整合裡你可以看到Link、Image、Flash就可以直接進行檔案上傳及管理動作,目前還沒有。
ASP.NET + CKFinder教學實作
- 下載CKFinder原始檔,我下載的是2.0版(28.05.2010),解壓縮,然後將ckfinder目錄複製或拉進Vistual Studio專案ckeditor目錄之下;(裡面有兩個目錄_samples、_source,學習可以留著看,正式上線就不要留了)下載CKFinder原始檔。
- 在ASP.NET專案之下新增一個目錄,用來上載之用。我們在根目鍵之下新增一個「uploads」目錄。CKFinder預設使用"/ckfinder/userfiles/"目錄。
- 檢查上載目錄權限,必須有寫入的權限。給IUSR_<ServerName>角色寫入的權限。
- 編輯...檔案。
 |
加入CKFinder目錄之下 |
然後在Bin目錄之下「加入參考」,將「CKFinder\bin\CKFinder.dll」加入。
 |
加入CKFinder.dll參考 | |
編輯config.ascx檔:
認證:有通過認證才能使用。
01 | public override bool CheckAuthentication() |
作者苦口婆心請大家不要設為「true;」,請大家注意,測試時還沒關係,正式上線
一定一定要設為false。
主要設定:
001 | public override void SetConfig() |
014 | BaseDir = "F:/WebDevelop/Study/StudyTest/DemoEditor/uploads/" ; |
017 | Plugins = new string [] { |
022 | PluginSettings = new Hashtable(); |
023 | PluginSettings.Add( "ImageResize_smallThumb" , "90x90" ); |
024 | PluginSettings.Add( "ImageResize_mediumThumb" , "120x120" ); |
025 | PluginSettings.Add( "ImageResize_largeThumb" , "180x180" ); |
030 | Thumbnails.Url = BaseUrl + "_thumbs/" ; |
031 | if ( BaseDir != "" ) { |
032 | Thumbnails.Dir = BaseDir + "_thumbs/" ; |
034 | Thumbnails.Enabled = true ; |
035 | Thumbnails.DirectAccess = false ; |
036 | Thumbnails.MaxWidth = 100; |
037 | Thumbnails.MaxHeight = 100; |
038 | Thumbnails.Quality = 80; |
043 | Images.MaxWidth = 1600; |
044 | Images.MaxHeight = 1200; |
049 | CheckSizeAfterScaling = true ; |
053 | ForceSingleExtension = true ; |
057 | HtmlExtensions = new string [] { "html" , "htm" , "xml" , "js" }; |
062 | HideFolders = new string [] { ".svn" , "CVS" }; |
067 | HideFiles = new string [] { ".*" }; |
070 | SecureImageUploads = true ; |
075 | RoleSessionVar = "CKFinder_UserRole" ; |
088 | AccessControl acl = AccessControl.Add(); |
090 | acl.ResourceType = "*" ; |
093 | acl.FolderView = true ; |
094 | acl.FolderCreate = true ; |
095 | acl.FolderRename = true ; |
096 | acl.FolderDelete = true ; |
099 | acl.FileUpload = true ; |
100 | acl.FileRename = true ; |
101 | acl.FileDelete = true ; |
113 | DefaultResourceTypes = "" ; |
117 | type = ResourceType.Add( "Files" ); |
118 | type.Url = BaseUrl + "files/" ; |
119 | type.Dir = BaseDir == "" ? "" : BaseDir + "files/" ; |
121 | type.AllowedExtensions = new string [] { "7z" , "aiff" , "asf" , "avi" , "bmp" , "csv" , "doc" , "docx" , "fla" , "flv" , "gif" , "gz" , "gzip" , "jpeg" , "jpg" , "mid" , "mov" , "mp3" , "mp4" , "mpc" , "mpeg" , "mpg" , "ods" , "odt" , "pdf" , "png" , "ppt" , "pptx" , "pxd" , "qt" , "ram" , "rar" , "rm" , "rmi" , "rmvb" , "rtf" , "sdc" , "sitd" , "swf" , "sxc" , "sxw" , "tar" , "tgz" , "tif" , "tiff" , "txt" , "vsd" , "wav" , "wma" , "wmv" , "xls" , "xlsx" , "zip" }; |
122 | type.DeniedExtensions = new string [] { }; |
124 | type = ResourceType.Add( "Images" ); |
125 | type.Url = BaseUrl + "images/" ; |
126 | type.Dir = BaseDir == "" ? "" : BaseDir + "images/" ; |
128 | type.AllowedExtensions = new string [] { "bmp" , "gif" , "jpeg" , "jpg" , "png" }; |
129 | type.DeniedExtensions = new string [] { }; |
131 | type = ResourceType.Add( "Flash" ); |
132 | type.Url = BaseUrl + "flash/" ; |
133 | type.Dir = BaseDir == "" ? "" : BaseDir + "flash/" ; |
135 | type.AllowedExtensions = new string [] { "swf" , "flv" }; |
136 | type.DeniedExtensions = new string [] { }; |
重要的有:
LicenseName = "";
LicenseKey = "";
這兩項是正式購買後可以取消提示訊息。
BaseUrl = "/ckfinder/userfiles/";
BaseDir = ""
我一開始使用預設值,但一直出現一個「110 : 不明錯誤」,後來查看文件後,最好的方式是:
BaseUrl使用完整網域路徑;
BaseDir使用完整實體路徑;
type.*
用來新增上載目錄、目錄路徑、類型、大小限制、副檔名限制…如果你需要有新的分類目錄,就從這裡下手,複製一份type.*的Code,修改為你需要的設定即可。預設有Files、Images、Flash三項,當你上載第一個檔案後,會在你設定上載目錄新增對應的子目錄。
執行測試檔「ckeditor\ckfinder\_samples\aspx\standalone.aspx」
 |
CKFinder |
按上傳檔案可以上傳檔案,在上傳好的檔案按左鍵,會出現管理選單。
那我要在一般*.aspx裡使用CKFinder呢?也很簡單:
- 先註冊CKFinder
- 使用CKFinder控制項
1 | <%@ Page Language= "VB" AutoEventWireup= "false" CodeFile= "Default.aspx.vb" nherits= "_Default" %> |
2 | <%@ Register Assembly = "CKFinder" Namespace = "CKFinder" TagPrefix= "CKFinder" %> |
5 | <CKFinder:FileBrowser ID= "FileBrowser1" BasePath= "ckeditor/ckfinder/" Width= "800" runat= "server" > |
6 | </CKFinder:FileBrowser> |
注意:
在使用CKFinder時,所特別注意「
路徑」問題,請搞清楚「絕對路徑」與「相對路徑」,絕大部出錯都是路徑有問題,例如在不同資料夾裡</CKFinder:FileBrowser ...>裡的BasePath路徑就會不一樣。
整合CKEditor與CKFinder教學實作
要整合CKEditor與CKFinder也很簡單,原始的JavaScript裡增加以下參數即可。
啟用CKFinder
01 | CKEDITOR.replace( '<%= ckdata.ClientID %>' , |
05 | filebrowserBrowseUrl : '/ckfinder/ckfinder.html' , |
06 | filebrowserImageBrowseUrl : '/ckfinder/ckfinder.html?type=Images' , |
07 | filebrowserFlashBrowseUrl : '/ckfinder/ckfinder.html?type=Flash' , |
08 | filebrowserUploadUrl : '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Files' , |
09 | filebrowserImageUploadUrl : '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Images' , |
10 | filebrowserFlashUploadUrl : '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Flash' |
 |
CKEditor中的CKFinder功能 |
不管是CKEditor或CKFinder都提供很好的解決方案,讓我們可以快速產生功能強大編輯區、上下載管理功能。不過其中還有許多細節,建議細讀原廠的文件,把不必要的功能關閉,例如限制副檔名…來減少不必要的風險。
參考:
CKSource Docs
下載CKEditor與CKFinder範例檔
CKFinder 並不是測試版,也不是免費。
回覆刪除http://ckfinder.com/purchase
Dear Ammon
回覆刪除感謝你的提醒。
可能用詞上理解不同,我知道這是要付費的,但它提供的功能完整,只差會一直提示這是Demo版本…,所以我定義為「測試版」,即只能使用在測試環境,如果要正式上線使用,還是必須採購其授權,授權部份我在最後一段也有介紹。
感謝您的分享~
回覆刪除最近也在嘗試這個東西,
感謝~
2011/11月會有幾篇 ASP.NET MVC版本,有興趣再回來看。
回覆刪除在整合之後
回覆刪除有沒有辦法修改程式讓code不要讓使用者直接上傳
而是從Browser之後,選擇上傳的目錄再上傳
http://blog.kkbruce.net/2011/11/aspnet-mvc-html-3-ckeditor-ckfinder.html#.Tyt1-Fz9PD8
回覆刪除這是ASP.NET MVC版本的文章。
請教大家
回覆刪除有遇過下列的情況嗎:執行CKFinder,會出現下列的訊息:因為安全因素,檔案瀏覽器已被停用!請聯絡您的系統管理者並檢查CKFinder的設定檔config.php!
https://drive.google.com/file/d/0BxriXuT0xeaFLVZmUjNxcmNfaEU/view?usp=sharing
我的uploads資料夾權限設定如網址:https://drive.google.com/file/d/0BxriXuT0xeaFN1ZPX29TcGRYTFU/view?usp=sharing
感謝
在本機測試時,設定為true,就不會出現錯誤了
刪除public override bool CheckAuthentication()
{
// WARNING : DO NOT simply return "true". By doing so, you are allowing
// "anyone" to upload and list the files in your server. You must implement
// some kind of session validation here. Even something very simple as...
//
// return ( Session[ "IsAuthorized" ] != null && (bool)Session[ "IsAuthorized" ] == true );
//
// ... where Session[ "IsAuthorized" ] is set to "true" as soon as the
// user logs on your system.
//return false;
return true;
}
請教, 是否有這範例檔可參考呢? 因為照著做無法成功, 謝謝
回覆刪除我生不出來11年前範例檔。
刪除