- CKEditor:3.3.2 (備份下載點)
授權分兩種,商業用途要付費。
CKEditor主要用途在「編輯」文件上,讓你可以更快速、更靈活的來進行編輯工作。
- CKFinder:2.0 (備份下載點)
目前提供的為「測試版」,在使用時會不斷顯示「這是Demo版本…」的訊息,不過功能不受影響,可以完整使用。
CKFinder主要用途在「檔案管理」,你可以透過CKFinder直接上傳檔案到伺服器上,然後進行管理,而且CKFinder可以與CKEditor進行整合,也就是在CKEditor就可以進行上傳檔案及其他CKFinder的功能。
目前CKFinder有分多個應用版本,因為我們以ASP.NET為主,所以請下載for asp.net的程式檔。
以下分三個部份
- 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指令碼,例如:
<script src="ckeditor/ckeditor.js" type="text/javascript" > </script>
- 放入一個Textbox控制項,有幾個重點:
ID:ckdata
TextMode:MultiLine
Rows:10
Columns:80
ClientIDMode:Static (.NET Framework 4)
- 在控制項下方撰寫Javascript指令碼
<script type="text/javascript"> CKEDITOR.replace('<%= ckdata.ClientID %>', {skin : 'kama'}); </script>
這裡主要是把Textbox的ID帶給CKEditor來使用,CKEditor才知道要把那一個Textbox變成「編輯區」。而最後{...}裡是主要細項設定的地方,可以用來改變CKEditor,例如skin是用來改變外觀,其他細部設定,請參考CKEditor 3.x - Developers Guide中Configuration一節。
另外,請務必把此段Javascript放到Textbox控制項的下方,如果放在head裡,會沒有效果。
IntelliSense |
最後完成的程式碼為:
<div> <asp:TextBox ID="ckdata" runat="server" TextMode="MultiLine" Rows="10" Columns="80" ClientIDMode="Static"></asp:TextBox> <script type="text/javascript" > CKEDITOR.replace('<%= ckdata.ClientID %>', {skin: 'kama'}); </script> </div>
然後執行網頁:
CKEditor介面 |
接下來,我們在畫面上放一個Button控制項及Lable控制項,我們要把Textbox的值取出來。
<div> <asp:TextBox ID="ckdata" runat="server" TextMode="MultiLine" Rows="10" Columns="80" ClientIDMode="Static"></asp:TextBox> <script type="text/javascript" > CKEDITOR.replace('<%= ckdata.ClientID %>', {skin: 'kama'}); </script> <asp:Button ID="SendData" runat="server" Text="Button" /> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> </div> '後置程式碼 Protected Sub SendData_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SendData.Click Me.Label1.Text = Me.ckdata.Text End Sub
執行後,隨便輸入一些文字,然後送出!!!
錯誤訊息 |
- 在開頭宣告裡加上屬性validateRequest="false";
- 在web.config裡新增httpRuntime標籤
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="DemoCKEditor.aspx.vb" Inherits="DemoCKEditor" ValidateRequest="false" %> 'web.confg <system.web> <compilation debug="false" strict="false" explicit="true" targetFramework="4.0" /> <httpRuntime requestValidationMode ="2.0"/> </system.web>
在.NET Framwork 3.5 SP1之前,只需要步驟1即可。
再為Button加上一些保護:
'後置程式碼 Protected Sub SendData_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SendData.Click Me.Label1.Text = HttpUtility.HtmlEncode(Me.ckdata.Text) End Sub
非常建議所有只要是「人工輸入」的內容都使用HttpUtility.HtmlEncode方法加以保護。
取得Textbox控制項的值 |
影像屬性 |
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檔:
認證:有通過認證才能使用。
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; }作者苦口婆心請大家不要設為「true;」,請大家注意,測試時還沒關係,正式上線一定一定要設為false。
主要設定:
public override void SetConfig() { // Paste your license name and key here. If left blank, CKFinder will // be fully functional, in Demo Mode. LicenseName = ""; LicenseKey = ""; // The base URL used to reach files in CKFinder through the browser. //BaseUrl = "/ckfinder/userfiles/"; BaseUrl = "http://localhost:49559/DemoEditor/uploads/"; // The phisical directory in the server where the file will end up. If // blank, CKFinder attempts to resolve BaseUrl. BaseDir = "F:/WebDevelop/Study/StudyTest/DemoEditor/uploads/"; // Optional: enable extra plugins (remember to copy .dll files first). Plugins = new string[] { // "CKFinder.Plugins.FileEditor, CKFinder_FileEditor", // "CKFinder.Plugins.ImageResize, CKFinder_ImageResize" }; // Settings for extra plugins. PluginSettings = new Hashtable(); PluginSettings.Add("ImageResize_smallThumb", "90x90" ); PluginSettings.Add("ImageResize_mediumThumb", "120x120" ); PluginSettings.Add("ImageResize_largeThumb", "180x180" ); // Thumbnail settings. // "Url" is used to reach the thumbnails with the browser, while "Dir" // points to the physical location of the thumbnail files in the server. Thumbnails.Url = BaseUrl + "_thumbs/"; if ( BaseDir != "" ) { Thumbnails.Dir = BaseDir + "_thumbs/"; } Thumbnails.Enabled = true; Thumbnails.DirectAccess = false; Thumbnails.MaxWidth = 100; Thumbnails.MaxHeight = 100; Thumbnails.Quality = 80; // Set the maximum size of uploaded images. If an uploaded image is // larger, it gets scaled down proportionally. Set to 0 to disable this // feature. Images.MaxWidth = 1600; Images.MaxHeight = 1200; Images.Quality = 80; // Indicates that the file size (MaxSize) for images must be checked only // after scaling them. Otherwise, it is checked right after uploading. CheckSizeAfterScaling = true; // Due to security issues with Apache modules, it is recommended to leave the // following setting enabled. It can be safely disabled on IIS. ForceSingleExtension = true; // For security, HTML is allowed in the first Kb of data for files having the // following extensions only. HtmlExtensions = new string[] { "html", "htm", "xml", "js" }; // Folders to not display in CKFinder, no matter their location. No // paths are accepted, only the folder name. // The * and ? wildcards are accepted. HideFolders = new string[] { ".svn", "CVS" }; // Files to not display in CKFinder, no matter their location. No // paths are accepted, only the file name, including extension. // The * and ? wildcards are accepted. HideFiles = new string[] { ".*" }; // Perform additional checks for image files. SecureImageUploads = true; // The session variable name that CKFinder must use to retrieve the // "role" of the current user. The "role" is optional and can be used // in the "AccessControl" settings (bellow in this file). RoleSessionVar = "CKFinder_UserRole"; // ACL (Access Control) settings. Used to restrict access or features // to specific folders. // Several "AccessControl.Add()" calls can be made, which return a // single ACL setting object to be configured. All properties settings // are optional in that object. // Subfolders inherit their default settings from their parents' definitions. // // - The "Role" property accepts the special "*" value, which means // "everybody". // - The "ResourceType" attribute accepts the special value "*", which // means "all resource types". AccessControl acl = AccessControl.Add(); acl.Role = "*"; acl.ResourceType = "*"; acl.Folder = "/"; acl.FolderView = true; acl.FolderCreate = true; acl.FolderRename = true; acl.FolderDelete = true; acl.FileView = true; acl.FileUpload = true; acl.FileRename = true; acl.FileDelete = true; // Resource Type settings. // A resource type is nothing more than a way to group files under // different paths, each one having different configuration settings. // Each resource type name must be unique. // When loading CKFinder, the "type" querystring parameter can be used // to display a specific type only. If "type" is omitted in the URL, // the "DefaultResourceTypes" settings is used (may contain the // resource type names separated by a comma). If left empty, all types // are loaded. DefaultResourceTypes = ""; ResourceType type; type = ResourceType.Add( "Files" ); type.Url = BaseUrl + "files/"; type.Dir = BaseDir == "" ? "" : BaseDir + "files/"; type.MaxSize = 0; 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" }; type.DeniedExtensions = new string[] { }; type = ResourceType.Add( "Images" ); type.Url = BaseUrl + "images/"; type.Dir = BaseDir == "" ? "" : BaseDir + "images/"; type.MaxSize = 0; type.AllowedExtensions = new string[] { "bmp", "gif", "jpeg", "jpg", "png" }; type.DeniedExtensions = new string[] { }; type = ResourceType.Add( "Flash" ); type.Url = BaseUrl + "flash/"; type.Dir = BaseDir == "" ? "" : BaseDir + "flash/"; type.MaxSize = 0; type.AllowedExtensions = new string[] { "swf", "flv" }; 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控制項
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" nherits="_Default" %> <%@ Register Assembly="CKFinder" Namespace="CKFinder" TagPrefix="CKFinder" %> ' ... 略 ... <div> <CKFinder:FileBrowser ID="FileBrowser1" BasePath="ckeditor/ckfinder/" Width="800" runat="server"> </CKFinder:FileBrowser> </div>
注意:
在使用CKFinder時,所特別注意「路徑」問題,請搞清楚「絕對路徑」與「相對路徑」,絕大部出錯都是路徑有問題,例如在不同資料夾裡</CKFinder:FileBrowser ...>裡的BasePath路徑就會不一樣。
整合CKEditor與CKFinder教學實作
要整合CKEditor與CKFinder也很簡單,原始的JavaScript裡增加以下參數即可。
啟用CKFinder
CKEDITOR.replace( '<%= ckdata.ClientID %>', { //注意路徑是否正確 //如果你的*.aspx在根目錄,那路徑應該是「ckeditor/ckfinder/...」 filebrowserBrowseUrl : '/ckfinder/ckfinder.html', filebrowserImageBrowseUrl : '/ckfinder/ckfinder.html?type=Images', filebrowserFlashBrowseUrl : '/ckfinder/ckfinder.html?type=Flash', filebrowserUploadUrl : '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Files', filebrowserImageUploadUrl : '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Images', filebrowserFlashUploadUrl : '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Flash' } );
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年前範例檔。
刪除