十分感谢lonestone

http://blog.csdn.net/lonestone/ 

CommnunityServer2.0由于其鲜明的web2.0特性和友好的用户界面以及强大的功能,吸引了包括我在内的越来越多的爱好者,不过相信对于官方原始版本的贴图和附件功能,一向是个问题,我想,最简单的解决方法就是给他的编辑器换成FCKeditor2.31,利用其可订制的上传文件功能来解决这个问题。

本例说涉及到的文件可以到这里下载。

编译好的dll和fckeditor编辑器

fckeditor2.31.net源代码

   说做就做,让我们打开vs2005,建立一个类库项目,比方说Cnfdc.FCKforCS,然后添加引用:

Communityserver.Controls

FredCK.FCKeditorV2

然后建立一个类,名叫FCK.cs

编写如下代码,对fCK按照cs要求的属性来进行封装:

namespace Cnfdc.FckForCs
{
    
using CommunityServer.Controls;
    
using FredCK.FCKeditorV2;
    
using System;
    
using System.Configuration;
    
using System.Web.UI.WebControls;

    [Editor(
"FCK编辑器标准版""FCK editor")]
    
public class FCK : FCKeditor, ITextEditor
    
{
        
private int _columns;
        
private bool _enableHTML = true;
        
private int _rows;
        
private string _styleName="Default";

        
public FCK()
        
{
            Modal m 
= new Modal();
            m.ModalType 
= ModalType.Window;

            
this.Controls.Add(m);            

            
this.ReConfigure();
        }


        
protected override void OnPreRender(EventArgs e)
        
{
            Configure();
            
base.OnPreRender(e);
        }


        
public void Configure()
        
{
            
if (this._enableHTML)
            
{
                
base.ToolbarSet = "Default";
            }

            
else
            
{
                
base.ToolbarSet = "Basic";
            }

       }


        
public void ReConfigure()
        
{
            
base.Height = Unit.Pixel(350);
            
if (base.Width.IsEmpty)
            
{
                
base.Width = Unit.Pixel(685);
            }

            
base.BasePath = ConfigurationSettings.AppSettings["FckEditor:BasePath"];
        }


        
public virtual int Columns
        
{
            
get
            
{
                
return this._columns;
            }

            
set
            
{
                
this._columns = value;
            }

        }


        Unit ITextEditor.Height
        
{
            
get
            
{
                
return base.Height;
            }

            
set
            
{
                
base.Height = value;
            }

        }


        
string ITextEditor.Text
        
{
            
get
            
{
                
return base.Value;
            }

            
set
            
{
                
base.Value = value;
            }

        }


        Unit ITextEditor.Width
        
{
            
get
            
{
                
return base.Width;
            }

            
set
            
{
                
base.Width = value;
            }

        }


        
public virtual bool EnableHtmlModeEditing
        
{
            
get
            
{
                
return this._enableHTML;
            }

            
set
            
{
                
this._enableHTML = value;
            }

        }


        
public string GetClientSideMethod
        
{
            
get
            
{
                
return "";
            }

        }


        
public virtual bool IsRichTextCapable
        
{
            
get
            
{
                
return base.CheckBrowserCompatibility();
            }

        }


        
public virtual int Rows
        
{
            
get
            
{
                
return this._rows;
            }

            
set
            
{
                
this._rows = value;
            }

        }


        
public virtual string StyleName
        
{
            
get
            
{
                
if (this._styleName == null)
                
{
                    
this._styleName = "Default";
                }

                
return this._styleName;
            }

            
set
            
{
                
this._styleName = value;
                
base.SkinPath = base.BasePath + "editor/skins/" + value + "/";
            }

        }



    }

}


然后将这个类库编译,拷贝生成的dll到cs的bin目录,同时将fckEditor的源码下载下来,注意要包括.net源码,将代码高亮的类放进去,以便使其中的代码高亮插件生效,然后也重新编译fckeditor,忘记说了,这个工作要放在FCK.cs前面,因为有dll版本依赖。

 

namespace FredCK.FCKeditorV2
{
    
using System;
    
using System.Collections;
    
using System.IO;
    
using System.Text.RegularExpressions;

    
public class HighLighter
    
{
        
public HighLighter()
        
{
            
this.replaceEnter = false;
        }


        
public string colorText(string tmpCode, string pathToDefFile, string language)
        
{
            language 
= language.ToLower();
            
if ((language == "c#"|| (language == "csharp"))
            
{
                language 
= "cs";
            }

            language 
= language.Replace(""""");
            
string text1 = "";
            
string text2 = "";
            
bool flag1 = true;
            ArrayList list1 
= new ArrayList();
            ArrayList list2 
= new ArrayList();
            
try
            
{
                StreamReader reader1 
= new StreamReader(pathToDefFile + language.ToString() + ".def");
                
string text3 = "";
                
string text4 = "";
                
while (reader1.Peek() != -1)
                
{
                    text3 
= reader1.ReadLine();
                    
if (text3 != "")
                    
{
                        
if (text3.Substring(01== "-")
                        
{
                            
if (text3.ToLower().IndexOf("keywords"> 0)
                            
{
                                text4 
= "keywords";
                            }

                            
if (text3.ToLower().IndexOf("keytypes"> 0)
                            
{
                                text4 
= "keytypes";
                            }

                            
if (text3.ToLower().IndexOf("comments"> 0)
                            
{
                                text4 
= "comments";
                            }

                        }

                        
else
                        
{
                            
switch (text4)
                            
{
                                
case "keywords":
                                    list1.Add(text3);
                                    
break;

                                
case "keytypes":
                                    list2.Add(text3);
                                    
break;

                                
case "comments":
                                    text2 
= text3;
                                    
break;
                            }

                        }

                    }

                }

                reader1.Close();
            }

            
catch (Exception exception1)
            
{
                exception1.ToString();
                text1 
= "<span class="errors">There was an error opening file " + pathToDefFile + language.ToString() + ".def...</span>";
                flag1 
= false;
                
throw new ApplicationException(string.Format("There was an error opening file {0}{1}.def", pathToDefFile, language), exception1);
            }

            
if (!flag1)
            
{
                
return text1;
            }

            
int num1 = 0;
            ArrayList list3 
= new ArrayList();
            MatchCollection collection1 
= Regex.Matches(tmpCode, text2, RegexOptions.Multiline | RegexOptions.IgnoreCase);
            
foreach (Match match1 in collection1)
            
{
                list3.Add(match1.ToString());
                tmpCode 
= tmpCode.Replace(match1.ToString(), "[ReplaceComment" + num1++ + "]");
            }

            num1 
= 0;
            ArrayList list4 
= new ArrayList();
            
string text5 = ""((\\")|[^"(\\")]|)+"";
            collection1 
= Regex.Matches(tmpCode, text5, RegexOptions.Singleline | RegexOptions.IgnoreCase);
            
foreach (Match match2 in collection1)
            
{
                list4.Add(match2.ToString());
                tmpCode 
= tmpCode.Replace(match2.ToString(), "[ReplaceString" + num1++ + "]");
            }

            num1 
= 0;
            ArrayList list5 
= new ArrayList();
            collection1 
= Regex.Matches(tmpCode, "'.*?'", RegexOptions.Singleline | RegexOptions.IgnoreCase);
            
foreach (Match match3 in collection1)
            
{
                list5.Add(match3.ToString());
                tmpCode 
= tmpCode.Replace(match3.ToString(), "[ReplaceChar" + num1++ + "]");
            }

            
string[] textArray1 = new string[list1.Count];
            list1.CopyTo(textArray1);
            tmpCode 
= Regex.Replace(tmpCode, @"" + ("(?<replacethis>" + string.Join("|", textArray1) + ")"+ @"(?<!//.*)""<span class="keyword">${replacethis}</span>");
            
string[] textArray2 = new string[list2.Count];
            list2.CopyTo(textArray2);
            tmpCode 
= Regex.Replace(tmpCode, @"" + ("(?<replacethis>" + string.Join("|", textArray2) + ")"+ @"(?<!//.*)""<span class="keytype">${replacethis}</span>");
            num1 
= 0;
            
foreach (string text8 in list5)
            
{
                tmpCode 
= tmpCode.Replace("[ReplaceChar" + num1++ + "]""<span class="string">" + text8.ToString() + "</span>");
            }

            num1 
= 0;
            
foreach (string text9 in list4)
            
{
                tmpCode 
= tmpCode.Replace("[ReplaceString" + num1++ + "]""<span class="string">" + text9.ToString() + "</span>");
            }

            num1 
= 0;
            
foreach (string text10 in list3)
            
{
                tmpCode 
= tmpCode.Replace("[ReplaceComment" + num1++ + "]""<span class="comment">" + text10.ToString() + "</span>");
            }

            tmpCode 
= Regex.Replace(tmpCode, @"(d{1,12}.d{1,12}|d{1,12})""<span class="integer">$1</span>");
            
if (this.replaceEnter)
            
{
                tmpCode 
= Regex.Replace(tmpCode, " """);
                tmpCode 
= Regex.Replace(tmpCode, " ""<br />" + Environment.NewLine);
            }

            tmpCode 
= Regex.Replace(tmpCode, "  ""&nbsp;&nbsp;");
            tmpCode 
= Regex.Replace(tmpCode, " ""&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
            text1 
= "<div class="codestuff">" + Environment.NewLine;
            text1 
= text1 + "<style type="text/css">" + Environment.NewLine;
            text1 
= text1 + "<!--" + Environment.NewLine;
            text1 
= text1 + ".codestuff .keytype { color : #FF9933; font-weight : normal; }" + Environment.NewLine;
            text1 
= text1 + ".codestuff .keyword { color : #224FFF; font-weight : normal; }" + Environment.NewLine;
            text1 
= text1 + ".codestuff .integer { color : #FF0032; }" + Environment.NewLine;
            text1 
= text1 + ".codestuff .comment { color : #008100; }" + Environment.NewLine;
            text1 
= text1 + ".codestuff .errors { color : #FF0000; font-weight : bold; }" + Environment.NewLine;
            text1 
= text1 + ".codestuff .string { color : #FF0022; }" + Environment.NewLine;
            text1 
= text1 + "//-->" + Environment.NewLine;
            text1 
= text1 + "</style>" + Environment.NewLine;
            text1 
= text1 + tmpCode;
            
return (text1 + "</div>" + Environment.NewLine);
        }



        
public bool ReplaceEnter
        
{
            
get
            
{
                
return this.replaceEnter;
            }

            
set
            
{
                
this.replaceEnter = value;
            }

        }



        
private bool replaceEnter;
    }

}


如果你的站比较大,那么可能就要修改上传文件的方法,加上自动重命名和分月目录,修改Uploader.cs:

/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2005 Frederico Caldeira Knabben
 * 
 * Licensed under the terms of the GNU Lesser General Public License:
 *         
http://www.opensource.org/licenses/lgpl-license.php
 * 
 * For further information visit:
 *         
http://www.fckeditor.net/
 * 
 * "Support Open Source software. What about a donation today?"
 * 
 * File Name: Uploader.cs
 *     This is the code behind of the uploader.aspx page used for Quick Uploads.
 * 
 * File Authors:
 *         Frederico Caldeira Knabben (fredck@fckeditor.net)
 
*/


using System ;
using System.Globalization ;
using System.Xml ;
using System.Web ;

namespace FredCK.FCKeditorV2
{
    
public class Uploader : FileWorkerBase
    
{
        
protected override void OnLoad(EventArgs e)
        
{
            
// Get the posted file.
            HttpPostedFile oFile = Request.Files["NewFile"];

            
// Check if the file has been correctly uploaded
            if (oFile == null || oFile.ContentLength == 0)
            
{
                SendResults(
202);
                
return;
            }


            
int iErrorNumber = 0;
            
string sFileUrl = "";

            
// Get the uploaded file name.
            
//string sFileName = System.IO.Path.GetFileName( oFile.FileName ) ;

            
//检查建立分月目录
            string sFolder = DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString();

            System.IO.DirectoryInfo dir 
= new System.IO.DirectoryInfo(System.IO.Path.Combine(this.UserFilesDirectory, sFolder));

            
if (!dir.Exists)
            
{
                dir.Create();
            }


            
//根据日期和随机数设置自动重命名文件
            Random rd = new Random();
            
string sFileName = sFolder + "/" + DateTime.Now.ToString("yyyyMMddHHmmss"+ rd.Next(10).ToString();

            
int iCounter = 0;

            
while (true)
            
{
                
//防止没有扩展名的处理,弃用内置方法
                string sFileExtension = string.Empty;
                
try
                
{
                    sFileExtension 
= oFile.FileName.Substring(oFile.FileName.LastIndexOf('.'), oFile.FileName.Length - oFile.FileName.LastIndexOf('.'));

                }

                
catch
                
{
                    
//Exception ex = new Exception(oFile.FileName);
                    
//throw ex;
                    sFileExtension = ".jpg";
                }

                
string sFilePath = System.IO.Path.Combine(this.UserFilesDirectory, sFileName) + sFileExtension;


                
if (System.IO.File.Exists(sFilePath))
                
{
                    iCounter
++;
                    sFileName 
=
                        sFileName 
+
                        
"(" + iCounter + ")" +
                        sFileExtension;

                    iErrorNumber 
= 201;
                }

                
else
                
{
                    oFile.SaveAs(sFilePath);

                    sFileUrl 
= System.IO.Path.Combine(this.UserFilesPath, sFileName + sFileExtension);
                    
break;
                }

            }


            SendResults(iErrorNumber, sFileUrl, sFileName);
        }


        
SendResults Method
    }

}

然后将重新编译的FredCK.EditerV2.dll也拷贝到cs的bin目录。

接下来将fckeditor的编辑器文件夹拷贝到cs的根目录,修改fckconfig.js

 

/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2006 Frederico Caldeira Knabben
 * 
 * Licensed under the terms of the GNU Lesser General Public License:
 *         http://www.opensource.org/licenses/lgpl-license.php
 * 
 * For further information visit:
 *         http://www.fckeditor.net/
 * 
 * "Support Open Source software. What about a donation today?"
 * 
 * File Name: fckconfig.js
 *     Editor configuration settings.
 *     See the documentation for more info.
 * 
 * File Authors:
 *         Frederico Caldeira Knabben (fredck@fckeditor.net)
 
*/


FCKConfig.CustomConfigurationsPath 
= '' ;

FCKConfig.EditorAreaCSS 
= FCKConfig.BasePath + 'css/fck_editorarea.css' ;

FCKConfig.DocType 
= '' ;

FCKConfig.BaseHref 
= '' ;

FCKConfig.FullPage 
= false ;

FCKConfig.Debug 
= false ;
FCKConfig.AllowQueryStringDebug 
= true ;

FCKConfig.SkinPath 
= FCKConfig.BasePath + 'skins/default/' ;
FCKConfig.PreloadImages 
= [ FCKConfig.SkinPath + 'images/toolbar.start.gif', FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif' ] ;

FCKConfig.PluginsPath 
= FCKConfig.BasePath + 'plugins/' ;

//添加插件
//
FCKConfig.Plugins.Add( 'placeholder', 'zh-cn' ) ;
FCKConfig.Plugins.Add( 'FastSmsTag''zh-cn' );     //系统标记插件
FCKConfig.Plugins.Add( 'EYSImageGallery''zh-cn' );    //插入媒体
FCKConfig.Plugins.Add( 'InsertCode''zh-cn' );    //插入代码
//
FCKConfig.Plugins.Add( 'UploadFile', 'zh-cn' );    //插入附件
//
FCKConfig.Plugins.Add( 'autogrow' ) ;
//
FCKConfig.AutoGrowMax = 400 ;

FCKConfig.ProtectedSource.Add( 
/<script[sS]*?</script>/gi ) ; // <SCRIPT> tags.
//
 FCKConfig.ProtectedSource.Add( /<%[sS]*?%>/g ) ;    // ASP style server side code <%...%>
//
 FCKConfig.ProtectedSource.Add( /<?[sS]*??>/g ) ;    // PHP style server side code
//
 FCKConfig.ProtectedSource.Add( /(<asp:[^>]+>[s|S]*?</asp:[^>]+>)|(<asp:[^>]+/>)/gi ) ;    // ASP.Net style tags <asp:control>

FCKConfig.AutoDetectLanguage    
= false ;
FCKConfig.DefaultLanguage        
= 'zh-cn' ;
FCKConfig.ContentLangDirection    
= 'ltr' ;

FCKConfig.ProcessHTMLEntities    
= true ;
FCKConfig.IncludeLatinEntities    
= true ;
FCKConfig.IncludeGreekEntities    
= true ;

FCKConfig.FillEmptyBlocks    
= true ;

FCKConfig.FormatSource        
= true ;
FCKConfig.FormatOutput        
= true ;
FCKConfig.FormatIndentator    
= '    ' ;

FCKConfig.ForceStrongEm 
= true ;
FCKConfig.GeckoUseSPAN    
= false ;
FCKConfig.StartupFocus    
= false ;
FCKConfig.ForcePasteAsPlainText    
= false ;
FCKConfig.AutoDetectPasteFromWord 
= true ;    // IE only.
FCKConfig.ForceSimpleAmpersand    = false ;
FCKConfig.TabSpaces        
= 0 ;
FCKConfig.ShowBorders    
= true ;
FCKConfig.SourcePopup    
= false ;
FCKConfig.UseBROnCarriageReturn    
= false ;    // IE only.
FCKConfig.ToolbarStartExpanded    = true ;
FCKConfig.ToolbarCanCollapse    
= true ;
FCKConfig.IgnoreEmptyParagraphValue 
= true ;
FCKConfig.PreserveSessionOnFileBrowser 
= false ;
FCKConfig.FloatingPanelsZIndex 
= 10000 ;

FCKConfig.ToolbarLocation 
= 'In' ;

FCKConfig.ToolbarSets[
"Default"= [
    [
'Source','DocProps','-','NewPage','Preview','-'],
    [
'Cut','Copy','Paste','PasteText','PasteWord'],
    [
'Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
    [
'Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],
    [
'OrderedList','UnorderedList','-','Outdent','Indent'],
    [
'TextColor','BGColor'],
    [
'JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
    [
'Link','Unlink','Anchor'],
    [
'Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak','UniversalKey'],
    [
'InsertMedia','InsertReal'],['InsertCode'],
    [
'Style','FontFormat','FontName','FontSize'],
    [
'FitWindow','-','About']
] ;

FCKConfig.ToolbarSets[
"Basic"= [
    [
'Source','-','Cut','Copy','Paste','PasteText','PasteWord'],
    [
'Bold','Italic','-','OrderedList','UnorderedList','-','Link','Unlink','-'],
    [
'Image','Flash','InsertMedia','InsertReal'],['InsertCode','About']
] ;

FCKConfig.ContextMenu 
= ['Generic','Link','Anchor','Image','Flash','Select','Textarea','Checkbox','Radio','TextField','HiddenField','ImageButton','Button','BulletedList','NumberedList','Table','Form'] ;

FCKConfig.FontColors 
= '000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,808080,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF' ;

FCKConfig.FontNames        
= '宋体;隶书;楷体_GB2312;仿宋_GB2312;黑体;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;
FCKConfig.FontSizes        
= '1/很小;2/较小;3/小;4/中等;5/大;6/较大;7/很大' ;
FCKConfig.FontFormats    
= 'p;div;pre;address;h1;h2;h3;h4;h5;h6' ;

FCKConfig.StylesXmlPath        
= FCKConfig.EditorPath + 'fckstyles.xml' ;
FCKConfig.TemplatesXmlPath    
= FCKConfig.EditorPath + 'fcktemplates.xml' ;

FCKConfig.SpellChecker            
= 'ieSpell' ;    // 'ieSpell' | 'SpellerPages'
FCKConfig.IeSpellDownloadUrl    = 'http://iespell.huhbw.com/ieSpellSetup220647.exe' ;

FCKConfig.MaxUndoLevels 
= 15 ;

FCKConfig.DisableObjectResizing 
= false ;
FCKConfig.DisableFFTableHandles 
= true ;

FCKConfig.LinkDlgHideTarget        
= false ;
FCKConfig.LinkDlgHideAdvanced    
= false ;

FCKConfig.ImageDlgHideLink        
= false ;
FCKConfig.ImageDlgHideAdvanced    
= false ;

FCKConfig.FlashDlgHideAdvanced    
= false ;

// The following value defines which File Browser connector and Quick Upload 
//
 "uploader" to use. It is valid for the default implementaion and it is here
//
 just to make this configuration file cleaner. 
//
 It is not possible to change this value using an external file or even 
//
 inline when creating the editor instance. In that cases you must set the 
//
 values of LinkBrowserURL, ImageBrowserURL and so on.
//
 Custom implementations should just ignore it.
var _FileBrowserLanguage    = 'aspx' ;    // asp | aspx | cfm | lasso | perl | php | py
var _QuickUploadLanguage    = 'aspx' ;    // asp | aspx | cfm | lasso | php

// Don't care about the following line. It just calculates the correct connector 
//
 extension to use for the default File Browser (Perl uses "cgi").
var _FileBrowserExtension = _FileBrowserLanguage == 'perl' ? 'cgi' : _FileBrowserLanguage ;

FCKConfig.LinkBrowser 
= false ;
FCKConfig.LinkBrowserURL 
= FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Connector=connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ;
FCKConfig.LinkBrowserWindowWidth    
= FCKConfig.ScreenWidth * 0.7 ;        // 70%
FCKConfig.LinkBrowserWindowHeight    = FCKConfig.ScreenHeight * 0.7 ;    // 70%

FCKConfig.ImageBrowser 
= false ;
FCKConfig.ImageBrowserURL 
= FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Image&Connector=connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ;
FCKConfig.ImageBrowserWindowWidth  
= FCKConfig.ScreenWidth * 0.7 ;    // 70% ;
FCKConfig.ImageBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7 ;    // 70% ;

FCKConfig.FlashBrowser 
= false ;
FCKConfig.FlashBrowserURL 
= FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Flash&Connector=connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ;
FCKConfig.FlashBrowserWindowWidth  
= FCKConfig.ScreenWidth * 0.7 ;    //70% ;
FCKConfig.FlashBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7 ;    //70% ;

FCKConfig.LinkUpload 
= true ;
FCKConfig.LinkUploadURL 
= FCKConfig.BasePath + 'filemanager/upload/' + _QuickUploadLanguage + '/upload.' + _QuickUploadLanguage ;
FCKConfig.LinkUploadAllowedExtensions    
= "" ;            // empty for all
FCKConfig.LinkUploadDeniedExtensions    = ".(php|php3|php5|phtml|asp|aspx|ascx|jsp|cfm|cfc|pl|bat|exe|dll|reg|cgi)$" ;    // empty for no one

FCKConfig.ImageUpload 
= true ;
FCKConfig.ImageUploadURL 
= FCKConfig.BasePath + 'filemanager/upload/' + _QuickUploadLanguage + '/upload.' + _QuickUploadLanguage + '?Type=Image' ;
FCKConfig.ImageUploadAllowedExtensions    
= ".(jpg|gif|jpeg|png)$" ;        // empty for all
FCKConfig.ImageUploadDeniedExtensions    = "" ;                            // empty for no one

FCKConfig.FlashUpload 
= true ;
FCKConfig.FlashUploadURL 
= FCKConfig.BasePath + 'filemanager/upload/' + _QuickUploadLanguage + '/upload.' + _QuickUploadLanguage + '?Type=Flash' ;
FCKConfig.FlashUploadAllowedExtensions    
= ".(swf|fla)$" ;        // empty for all
FCKConfig.FlashUploadDeniedExtensions    = "" ;                    // empty for no one

FCKConfig.SmileyPath    
= FCKConfig.BasePath + 'images/smiley/msn/' ;
FCKConfig.SmileyImages    
= ['regular_smile.gif','sad_smile.gif','wink_smile.gif','teeth_smile.gif','confused_smile.gif','tounge_smile.gif','embaressed_smile.gif','omg_smile.gif','whatchutalkingabout_smile.gif','angry_smile.gif','angel_smile.gif','shades_smile.gif','devil_smile.gif','cry_smile.gif','lightbulb.gif','thumbs_down.gif','thumbs_up.gif','heart.gif','broken_heart.gif','kiss.gif','envelope.gif'] ;
FCKConfig.SmileyColumns 
= 8 ;
FCKConfig.SmileyWindowWidth        
= 320 ;
FCKConfig.SmileyWindowHeight    
= 240 ;

主要注意插件的添加和文件上传部分的配置,以及简化工具栏的设置。这个简化版的工具栏可以配合前面提到的快速回复使用哦。

最后,修改cs的web.config,在<appsettings>节加入下面一段

    <!--FCK编辑器配置-->
    
<add key="FckEditor:BasePath" value="/FCKeditor/"/>

打开Communityserver.config,修改<core>节相应的为这一段

textEditorType = "Cnfdc.FckForCs.FCK, Cnfdc.FckForCs" 

好了,祈祷一下吧,刷新你的cs,然后到个人资料修改中设置使用的编辑器为:HTML编辑器标准版( 如果看不到的话,就有问题了)

体验一下diy的乐趣吧!

有问题,大家一起探讨!



http://www.kwkj.cn/forums/forums/permalink/11144/10736/ShowThread.aspx

FCKeditor2.2+ASP.NET2.0不完全攻略

摘自<http://www.onlinegf.com/bbs/showpost.asp?threadid=120>

FCKeditor相关资料简介:

官方网站http://www.fckeditor.net/

官方文档http://wiki.fckeditor.net/

下载地址http://www.fckeditor.net/download/default.html

官方演示http://www.fckeditor.net/demo/default.html

 

 

针对于ASP.NET开发者来说,你有两种选择:

1.        只使用FCKeditor,下载http://sourceforge.net/project/showfiles.php?group_id=75348&package_id=75845,然后自行配置其中的几个核心js文件。对此发开不作为本文所讨论的范畴。

2.        使用FCKeditor.Net,下载http://sourceforge.net/project/showfiles.php?group_id=75348&package_id=137125。需要声明的是,这个文件只是一个ASP.NET控件DLL文件,并不包括FCKeditor的编辑器内核。所以你还应该下载上一种方式中提到的文件包。

 

下面结合一个ASP.NET2.0的项目来具体看看FCKeditor的安装、配置。在开始之前请先下载FCKeditor文件包和FCKeditor.Net 服务器控件。启用VS2005新建一个C#WEB Site工程,取名FCKPro

 

FCKeditor安装:

所谓安装就是一个简单的拷贝过程。

把下载的FCKeditor_2.2.zip文件包直接解压缩到FCKPro的根目录下,这样根目录下就得到一个FCKeditor文件夹,里面富含所有FCKeditor的核心文件。

然后把下载的FCKeditor.Net_2.2.zip随便解压缩到你硬盘的一个空目录,里面是FCKeditor.Net的源代码(基于.NET1.1C#工程),你可以用VS2003来对它进行再度开发,本文尚不涉及本内容,我们只是直接使用FCKeditor.Net工程目录下的\bin\Release目录中的FredCK.FCKeditorV2.dll文件。

VS2005中添加对FredCK.FCKeditorV2.dll的引用:

1.        FCKPro工程浏览器上右键,选择添加引用(Add Reference…),找到浏览(Browse)标签,然后定位到你解压好的FredCK.FCKeditorV2.dll,确认就可以了。这时,FCKPro工程目录下就多了一个bin文件夹,里面包含FredCK.FCKeditorV2.dll文件。当然,你也可以完全人工方式的来做,把FredCK.FCKeditorV2.dll直接拷贝到FCKPro\bin\下面,VS2005在编译时会自动把它编译进去的。

2.        为了方便RAD开发,我们把FCKeditor控件也添加到VS的工具箱(Toolbox)上来,展开工具箱的常用标签组(General),右键选择组件(Choose Items…),在对话框上直接找到浏览按钮,定位FredCK.FCKeditorV2.dll,然后确认就可以了。这时工具箱呈现

我的经验告诉我,这样会省去很多在开发时使用FCKeditor控件时要添加的声明代码。

 

至此,你已经完成了FCKeditor的安装,并可以在你的项目中使用FCKeditor了,当然后面还有很多需要配置的东西。

 

FCKeditorASP.NET2.0 Web项目中的配置:

现在,我开始来把FCKeditor应用在我们的项目中。打开Default.aspx,切换到设计模式(Design),把FCKeditor控件从工具箱上拖动下来,在Default页上你就可以看到这个FCKeditor了,不过这时只能看到一个FCKeditor的站位框,不会看到运行时的效果,鼠标选中FCKeditor1后,在属性(Property)面板上可以设置这个FCKeditor对象的一些基本属性。比较重要的是BasePath属性,如果先前FCKeditor就定在了根目录的FCKeditor下,就设置成~/FCKeditor/,如果是别的目录名就换成相应的值(注意:控件默认值是/FCKeditor/,因为我们使用的是服务器控件设置了runat="server"属性所以要显式的声明BasePath="~/FCKeditor/")。把Default.aspx切换到源代码模式(Source),我们可以看到IDE自动生成的代码:

<%@ Register Assembly="FredCK.FCKeditorV2" Namespace="FredCK.FCKeditorV2" TagPrefix="FCKeditorV2" %>

 

<FCKeditorV2:FCKeditor ID="FCKeditor1" runat="server"></FCKeditorV2:FCKeditor>

 

如果当初没有把FCKeditor添加到工具箱上,那么应该在添加引用后自己手动来添加这些代码。

在源代码模式下,把鼠标点在FCKeditorV2:FCKeditor标签内容上,它会加粗显示,这时属性面板上显示出了FCKeditor服务器控件的全部属性,比在设计模式时多出了许多。

属性列表:

AutoDetectLanguage

BaseHref

BasePath

ContentLangDirection

CustomConfigurationsPath

Debug

DefaultLanguage

EditorAreaCSS

EnableSourceXHTML

EnableViewState

EnableXHTML

FillEmptyBlocks

FontColors

FontFormats

FontNames

FontSizes

ForcePasteAsPlainText

ForceSimpleAmpersand

FormatIndentator

FormatOutput

FormatSource

FullPage

GeckoUseSPAN

Height

ID

ImageBrowserURL

LinkBrowserURL

PluginsPath

runat

SkinPath

StartupFocus

StylesXMLPath

TabSpaces

ToolbarCanCollapse

ToolbarSet

ToolbarStartExpanded

UseBROnCarriageReturn

Value

Visible

Width

事件列表:

OnDataBinding

OnDisposed

OnInit

OnLoad

OnPreRender

OnUnload

 

以上属性和事件的使用在此不一一的赘述了,请先自行摸索一下,目前我也没找到相关资料,不过都不是很难,如果你有在asp下使用FCKeditor的经验,应该明白其中一些属性的意义,和fckconfig.js的设置项意义相同。以后有时间我会再把这部分整理好。需要说明的是FCKeditor2.2fckconfig.js2.0版本的有了较大改进,体积更小,配置方式也更加灵活,具体请自行下载比较。

针对这个示例我配置的代码如下:

<FCKeditorV2:FCKeditor

    ID="FCKeditor1"

    runat="server"

    AutoDetectLanguage="false"

    DefaultLanguage="zh-cn"

    BasePath="~/FCKeditor/">

</FCKeditorV2:FCKeditor>

好,现在运行一下这个页面,允许修改Web.Config(这样IDE会自动在工程下添加一个Web.Config文件)。看到效果了吧!

有人会问:怎么得到一个HTTP Error 404 - Not Found.的错误呢?得到这个错误一般是BasePath没有设置正确,参看上述提到的BasePath注意事项仔细检查!

到了这里,FCKeditor的配置并没有真正的完成,因为它里面的一个强大功能我们还没正确配置:文件上传。

Default.aspx的运行模式下,点FCKeditor的“插入/编辑图像”(又或者是Flash)功能,在弹出框点“浏览服务器”,又弹出一个对话框,此时随即出现的是一个错误提示框XML request error: Forbidden(403).

得到这样的错误有Web开发经验的都知道403应该是读写权限的问题。可是为什么呢?原因在于没有配置UserFiles路径。

我们在FCKPro根目录下,新建一个空目录Files。连同BasePath的设置通常的做法是这样的:

打开FCKPro工程的Web. Config文件,修改appSettings元素,配置如下:

<appSettings>

 <add key="FCKeditor:BasePath" value="~/FCKeditor/"/>

 <add key="FCKeditor:UserFilesPath" value="/FCKPro/Files" />

</appSettings>

设置了FCKeditor:BasePath后就不用再每次使用FCKeditor实例时指定BasePath属性了,FCKeditor:UserFilesPath则是制定我们所有上传的文件的所在目录。你也许会问为什么要设置成/FCKPro/Files这样而不是~/Files,因为FCKeditor使用这个值来返回你上传后的文件的相对路径到客户端,~/Files的形式是ASP.NET在服务可以编译解释的,但是在客户端的静态就不懂这是什么了。如果使用~/Files后,那么所有上传文件的返回路径都是~/Files形式的,你就会得到这样的链接http://~/Files/Image/logo.gif这样的链接解果就是路径为找到。所以才要我们上述那样设置,这是在开发阶段,如果在工程完成后发布时请记住把/FCKPro/Files改成/Files,道理不说大家也明白,开发阶段VS2005在运行项目时的URLhttp://localhost/项目名称/的形式,发布后在Server上建立站点,跟路径就是http://www.abc.com/的形式了,所以发布后一定要改过来。这些地方是在使用FCKeditor2.2+ASP.NET2.0时经常发错误而又莫名其所云的地方。

先不要高兴,这个上传的功能至此还差最关键的一步。在FCKeditor所在根目录下(FCKPro/FCKeditor/)找到fckconfig.js文件,用文本编辑器打开,在大概132行(大概是因为之前您也许参考其它资料更改过这个文件了)的地方找到:

 

var _FileBrowserLanguage    = 'asp' ;      // asp | aspx | cfm | lasso | perl | php | py

var _QuickUploadLanguage = 'asp' ;      // asp | aspx | cfm | lasso | php

 

把这两行赋值代码的值由asp改成aspx,保存关闭这个文件。

好了,大功告成了!在此运行FCKPro项目,使用浏览服务器功能,OK了吧?

 

再提一下:

对于开发中使用文件上传功能遇到 XML request error: Internal Server Error(500) 错误的解决办法。

遇到500内部错误是怎么回事呢?

因为ASP.NET2.0新增了Theme功能,所以如果在你的工程中你对Web.config使用到了styleSheetThemetheme话那就要再多修改一下。

还是到FCKeditor所在的目录,分别打开\editor\filemanager\upload\aspx\upload.aspx\editor\filemanager\browser\default\connectors\aspx\connector.aspx两个aspx文件,在page标签中添加Theme=""StyleSheetTheme=""看你在工程使用的是什么就修改什么。修改后如下:

<%@ Page language="c#" Inherits="FredCK.FCKeditorV2.Uploader" AutoEventWireup="false" Theme="" %>

<%@ Page language="c#" Inherits="FredCK.FCKeditorV2.Uploader" AutoEventWireup="false" StylesheetTheme="" %>

这样就解决了500的内部错误。

posted on 2007-02-27 10:36  mbskys  阅读(509)  评论(0编辑  收藏  举报