朱博的技术园

关注基于.Net的Web解决方案,高性能数据库设计,高性能Web服务解决方案,关注移动开发

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  22 随笔 :: 0 文章 :: 349 评论 :: 3 引用

前言

FCKeditor是使用非常广泛的HTML编辑器,本文从 ASP.NET 的使用场景对 FCKeditor 与 FCKeditor.NET 的配置、功能扩展(如自定义文件上传子目录自定义文件名上传图片的后期处理等)、以及安全性进行初步的阐述。

希望能帮助有同样需求的同仁节省一点时间;也希望各位能指正其中的不足。谢谢。

 

一、自定义 FCKeditor 的 BasePath

BasePath 即FCKeditor在网站中的相对路径,默认值是 /fckeditor/,最好在Web.config appSettings中对其进行配置:

<add key="FCKeditor:BasePath" value="/FCKeditor_2.6.3/"/>


这样做有诸多优点:

  1. 开发环境与生产环境不同,开发环境一般是http://localhost/xxx.com/这种情况下FCKeditor就得放在一个虚拟目录http://localhost/fckeditor/中,若涉及多个网站的开发,而各网站的FCKeditor有差别时,这样显然不是最优;
    而且因为物理目录结构与逻辑目录结构不同,也会有发生错误的隐患;
    而如果采用Web.config的配置,就可以在开发环境采用不同的配置,FCKeditor的物理路径与生产环境保持一致;
  2. 当升级FCKeditor时,只需要将新版本的FCKeditor放在相应版本号的目录里,修改一下配置即可。这样可以解决因为静态资源的客户端缓存问题,不同用户出现不同的错误的问题;
  3. 可以直观地看到自己的FCKeditor的版本号。


二、配置文件上传的目录

FCKeditor的文件上传(如图片上传)目录可以通过Web.config appSettings进行配置,如:

<add key="FCKeditor:UserFilesPath" value="/UploadFile/FCKeditor/"/>


也可以在 /FCKeditorBasePath/editor/filemanager/connectors/aspx/config.ascx 中进行配置,但我建议 FCKeditor 目录中的内容能不改就不改(fckconfig.js除外),这样日后升级可以放心地替换即可。


三、自定义文件上传的子目录的格式

我们知道,一个文件夹下面不能存放过多的文件(据称Windows下面的目录下2000为阈值),否则对该目录的访问会严重影响I/O性能。而FCKeditor的文件存储是在单一的一个目录进行的。我对FCKeditor进行了扩展,可以在Web.config appSettings对存储目录的格式自定义,如:

<add key="FCKeditor:FolderPattern" value="%y/%m-%d/"/>


========================================
以今天的日期为例:这样产生的文件上传子目录格式为:2008/10-21/。
年月日格式的目录可以随意组合,如:

<add key="FCKeditor:FolderPattern" value="%y/%m/%d/"/>

这样产生的文件上传子目录变成了2008/10/21/

========================================
还可以针对不同登录的用户,采用不同的上传子目录
Web.config 修改上传子目录的配置,增加%u表示不同用户使用基于其标识不同的上传子目录

<add key="FCKeditor:FolderPattern" value="%u/%y/%m/%d/"/>

FCKeditor_2.6.3\editor\filemanager\connectors\aspx\config.ascx 中增加获取当前登录用户标识的逻辑

public override void SetConfig()
{
#region Bochuh's Modification
// Identifier for logined user
// Leave blank for default user upload folder
LoginedUserIdentifier = "44";
// 这里替换成获取当前登录用户表示的代码
#endregion

//
……此文件中原来的代码
}

这样可以对不同用户,根据其登录后的标识(一般是用户ID),来使用不同的目录进行存储,如:7394/2008/10/21/(7394是当前登录用户的ID)

 

参考:

  • %u   代表 当前登录用户的标识
  • %y    代表 当前时间的年份
  • %m    代表 当前时间的月份
  • %d    代表 当前时间的日


四、自定义文件上传的文件名格式

FCKeditor对文件名的处理规则是:如果当前目录下没有重名文件,则上传后的文件名与用户PC上的文件名一致;若存在n个重名文件,则加入用户PC上的文件名是Example.xxx,上传后的文件名变为:Example(n).xxx

我的项目里要求对用户上传的文件名变成Guid的格式,所以我对FCKeditor也做了扩展,在Web.config appSettings可以对上传后文件的格式自定义,如:

 

<add key="FCKeditor:FilenamePattern" value="%guid.%extl"/>


这样的文件名如:a299e63a-7d2d-493d-bbb9-99162ef5b6b8.gif

参考:

  • %guid    代表 一个新的guid字符串
  • %fnl    代表 源文件名的小写
  • %fnu    代表 源文件名的大写
  • %extl    代表 源文件扩展名的小写
  • %extu    代表 源文件扩展名的大写


五、对上传图片进行缩放处理

用到FCKeditor图片上传功能的场景中,很多是内容的发表。内容中往往不需要几千像素大小的图片,比如我的项目中,文章区域最宽也就560像素,所以我做了一个扩展,在Web.config appSettings中可以对图片的最大宽度进行自定义:

<add key="FCKeditor:MaxWidthOfUploadedImg" value="560"/>


有了这段配置,上传后的图片的宽度都控制在了560像素及以内


六、自定义上传后图片URL中的域名

为了加快页面的渲染,我们可以把图片等静态资源放在一个独立的域名当中。但FCKeditor默认的图片上传后URL是相对路径,如图:

我增加了这个扩展,在Web.config appSettings可以配置上传后图片URL的域名,如:

<add key="FCKeditor:UploadedFilesDomain" value="http://a.cvimg.cn/"/>

 

如图:

 


七、解决上传文件名含有中文的文件时提示 "invalid file type" 的问题

这个问题只需要在Web.config中增加一段配置即可解决:

<location path="FCKeditor_2.6.3/editor/filemanager/connectors/aspx/upload.aspx">
    
<system.web>
        
<globalization requestEncoding="utf-8" responseEncoding="gb2312"/>
    
</system.web>
</location>


注意:

  1. responseEncoding是网站的默认编码
  2. FCKeditor_2.6.3是FCKeditor的BasePath


八、FCKeditor的安全性

在FCKeditor的2.3.2版本里,曾有一个漏洞,可以通过 /editor/filemanager/browser/default/connectors/aspx/connector.aspx 往服务器上传任意文件,我的网站就曾经中招。

2.6.3虽然暂未发现类似的问题,但一般情况下用不到的文件最好还是删除比较好:

  1. FCKeditor BasePath 根目录中除了保留:
    1. /editor
    2. /fckconfig.js
    3. /fckpackager.xml
    4. /fckstyles.xml
    5. /fcktemplates.xml
    6. /license.txt
    外,全部删除
  2. /editor/filemanager/中除了保留:
    1. /connectors/aspx/config.ascx
    2. /connectors/aspx/upload.aspx
    外,全部删除
  3. 删除 /editor/_source/
  4. /editor/filemanager/connectors/aspx/config.ascx 的 CheckAuthentication() 方法中,增加验证用户是否登录的逻辑

注意:以上措施仅适用于ASP.NET的网站,其他语言版本的网站未考虑。

附:基于FCKeditor.Net_2.6.3修改后的源码

SOURCE: http://files.cnblogs.com/zhubo/FCKeditor.Net_2.6.3_20090713.zip
BIN(.NET 2.0): http://files.cnblogs.com/zhubo/FredCK.FCKeditorV2_20090713.zip

  1. 对以下文件的指定行进行了修改,
    /FileBrowser/Config.cs  line 45, 116, 169
    /FileBrowser/FileWorkerBase.cs  line 68, 98, 110, 125, 278
  2. 所有修改的地方均包含在名为 "ZhuBo's Modification" 的代码块中,也可以通过搜索整个项目中的 "ZhuBo's Modification" 快速看到改动的地方,方便自己的扩展(比如可以设定图片的最大高度)

更新 at 2008-11-11

新增可选的根据用户标识让不同用户使用独自的图片上传子目录,参见上文中“三、自定义文件上传的子目录的格式”的更新部分。

新的源码与dll文件也已更新。

更新 at 2009-07-06

感谢新手中的新手的发现,修正了以下Bug:未配置FCKeditor:FolderPattern,或者FCKeditor:FolderPattern为空时,上传图片成功后的路径中多了一个"/"

更新 at 2009-07-13

图片后缀名为.gif的不做压缩处理,防止动画效果丢失。

更新 at 2011-08-23

看到不少朋友在配置时出问题,特将 FCKeditor 2.6.6 和 FCKeditor.net 2.6.3整合到了一个Demo项目里,可以直接下载该Demo,在VS里打开,找到 FCKEditorDemo 项目中的Default.aspx,右键View in browser即可预览,其配置供大家参考
FCKEditorDemo.zip

 

posted on 2008-10-21 15:52 朱博 阅读(7732) 评论(95) 编辑 收藏

评论

#1楼 2008-10-21 16:19 张明海      
不错 下次就按照你这个这么用
 回复 引用 查看   

#2楼 2008-10-21 18:20 SvnHost[未注册用户]
不错
 回复 引用   

#3楼 2008-10-21 18:38 AlphaWu      
不错。我也对FckEditor进行了扩展,我主要扩展的是图片上传的时候添加水印和生产缩略图。
http://wupeng.cn/post/2008/10/15/FckEditor-enhance-the-image-upload-feature.aspx
 回复 引用 查看   

#4楼[楼主] 2008-10-21 18:50 朱博      
@AlphaWu
我看到你的了,你的更加侧重用户的选择,很棒。如果可以提供源码就更好了。
 回复 引用 查看   

#5楼 2008-10-21 20:30 自知      
关于安全的问题,主要是去掉源代码中的SetConfig()方法,并在config.ascx中去掉SetConfig()方法。如果可以在config.ascx中修改上传设置的话,危险始终会存在。
 回复 引用 查看   

#6楼[楼主] 2008-10-21 21:38 朱博      
@自知
谢谢你的意见。但我不是太明白,除了管理员,用户有可能修改config.ascx?还是有其他的攻击方式?麻烦明示,谢谢。
 回复 引用 查看   

#7楼 2008-10-21 21:57 菜菜灰      
谢谢,非常有用~~
 回复 引用 查看   

#8楼 2008-10-21 21:58 菜菜灰      
是否能讲一下,扩展其他的插件,如插入内框架,插入视频等等~~
 回复 引用 查看   

#9楼 2008-10-21 22:53 canbeing      
不错
不过有一点,如果有根据不同的用户来将文件传到不能目录的话,就还需要再改一个程序了。
 回复 引用 查看   

#10楼[楼主] 2008-10-21 23:15 朱博      
@菜菜灰
我暂时还没有遇到类似的需求,不过修改起来应该是同样的道理。你可以分析一下源码。
 回复 引用 查看   

#11楼[楼主] 2008-10-21 23:18 朱博      
@canbeing
不错的建议。的确是要改程序的,在文中第八点所讲:“config.ascx 的 CheckAuthentication() 方法中,增加验证用户是否登录的逻辑”,这里就可以把要上传的目录动态设定好。

当然,如果要做到普适,也可以做一个选项,比如FCKeditor:UniqueFolderForUsers为true时,才设定用户的目录。
 回复 引用 查看   

#12楼 2008-10-22 08:06 自知      
@朱博
如果服务器是自己公司专用的,只放自己公司的网站则问题不大
我们做的是通用产品,出过一些问题,所以我们就把这里修改了,当然fckeditor只是一个上传webshell的途径,服务器的安全设置才是最重要的。
 回复 引用 查看   

#13楼 2008-10-22 09:41 胡枫      
有个问题请教哦。比如我的网站使用fckeditor的目录是d:\abc\fckeditor\
我想上传到另外一个站点路径是d:\ccc\upload\这边。
需要怎么设置呢。如果用相对路径好像是访问不到的吧。两个不同的站点。不是同一个站点的。我试了试<add key="FCKeditor:UserFilesPath" value="../ccc/upload/fckeditor"/>这样是不行的。
 回复 引用 查看   

#14楼[楼主] 2008-10-22 11:06 朱博      
@自知
谢谢自知的答复。我当时服务器的目录权限做了,比如存放静态资源的目录不具有脚本执行权限,但后来发现FCKeditor的漏洞能让用户传文件到我网站的任意目录。之前做的安全配置直接无效,很是郁闷。
 回复 引用 查看   

#15楼[楼主] 2008-10-22 11:13 朱博      
@胡枫
这样配置的确是不行,因为你的目录访问符不能超过你的站点根目录。如果需要上传到网站外的目录,你可以这样:

网站A根目录:d:\abc\,URL:http://websiteB.com/
要上传到的网站B目录:d:\ccc\upload\,URL:http://websiteB.com/upload/

在网站A中配置一个虚拟目录指向网站B的目录,可以通过http://websiteA.com/upload/访问到实际位于网站B的目录

以上配置完成后,把网站A FCKeditor:UserFilesPath 值设定为 /upload/:
<add key="FCKeditor:UserFilesPath" value="/upload/"/>

应该就可以了。
 回复 引用 查看   

#16楼 2008-10-22 12:52 zmxmiss      
如何在用户(多个个人用户)上传图片的时候,动态创建一个文件夹用来存放此个人用户的图片文件,当用户在插入图片和删除图片的时候也只能看到属于自己文件夹的图片,并管理他们的功能? 实现这个需要修改什么地方呢?
 回复 引用 查看   

#17楼 2008-10-22 13:50 Fishope      
有空的时候好好看看
 回复 引用 查看   

#18楼[楼主] 2008-10-22 13:53 朱博      
@zmxmiss
当前登录用户的唯一标识(比如ID)是可以获得的,在文中第八点所讲:“config.ascx 的 CheckAuthentication() 方法中”,你既可以实现检查用户是否登录成功的逻辑;又可以记录当前登录用户的唯一标识,然后把这个唯一标识作为构造上传子目录的一部分即可。

FCKeditor.Net项目中需要修改的文件应该是:
\FCKeditor.Net_2.6.3\FileBrowser\FileWorkerBase.cs
\FCKeditor.Net_2.6.3\FileBrowser\Config.cs

至于用户可以管理他上传的文件,这个我没有试过,不过基于上面的思想,也是可以做到的。
你可以研究一下FCKeditor.NET与FCKeditor的LinkBrowser、ImageBrowser、FlashBrowser的代码,应该会有办法。
 回复 引用 查看   

#19楼 2008-10-23 11:13 zmxmiss      
谢谢了 去看看
 回复 引用 查看   

#20楼 2008-10-31 16:50 LifeKiller      
提个建议。如果图片大小小于设定,那么应该就不要再重新拿 System.Drawing去画了。
 回复 引用 查看   

#21楼[楼主] 2008-10-31 16:58 朱博      
@LifeKiller
好建议,非常感谢。
 回复 引用 查看   

#22楼 2008-11-01 20:58 ZHAOYN[未注册用户]
请教一下。我想限制上传图片的大小控制在1M以内,应该怎么做。我用的是FCK2.6,在Dialog里的image/image.js里添加校验代码为什么不好用
就是new 一个image,然后指定src是本地路径,然后用image.fileSize始终是-1 ,不知道为什么,楼主能否给解决一下,另外我不想通过webConfig来限制大小,因为项目中其他部分也可能上传视频等。所以不能统一限制。
 回复 引用   

兄弟,你能不能把整个DEMO提供下,我以前用是的5版本的,你的功能确实很棒,但是我引用你给你的动态链接库,一直报错
 回复 引用   

朋友,原来是浏览器缓存的问题,晕的要死,我把IE缓存删除掉就可以了。现在我继续做你上面内容的操作看下
 回复 引用   

一切搞定,很棒。不过有个问题,能不能单独设置某个用户,比如有连个管理员的ID分别是55,56.那么能不能设置不通的管理员只能上传到自己的目录下,并且只能看下自己文件夹的文件?谢谢
 回复 引用   

补充下:FCKConfig.ImageBrowser = true ;和FCKConfig.FlashBrowser = true ;要是同时设置为false的话,就不能浏览文件了,不知道实现只能浏览自己的目录难不难?
 回复 引用   

忙疯掉了,问题差不多解决了。。。

protected string UserFilesPath
{
get
{
if ( sUserFilesPath == null )
{
// 第一回从Application["FCKeditor:UserFilesPath"] 中读取,如果没有尝试其它方式
sUserFilesPath = (string)Application["FCKeditor:UserFilesPath"] ;

// 第二回从Session["FCKeditor:UserFilesPath"] 中读取,如果没有尝试其它方式
if ( sUserFilesPath == null || sUserFilesPath.Length == 0 )
{
sUserFilesPath = (string)Session["FCKeditor:UserFilesPath"] ;

// 第三回从web.config中读取,如果没有尝试其它方式
if ( sUserFilesPath == null || sUserFilesPath.Length == 0 )
{
sUserFilesPath = System.Configuration.ConfigurationSettings.AppSettings["FCKeditor:UserFilesPath"] ;

// 第四回从DEFAULT_USER_FILES_PATH(这个变量在同文件中)中读取,如果没有尝试其它方式
if ( sUserFilesPath == null || sUserFilesPath.Length == 0 )
sUserFilesPath = DEFAULT_USER_FILES_PATH ;

// 第五回从网址参数ServerPath中读取
if ( sUserFilesPath == null || sUserFilesPath.Length == 0 )
{
sUserFilesPath = Request.QueryString["ServerPath"] ;
}

}
}

// Check that the user path ends with slash ("/")
if ( ! sUserFilesPath.EndsWith("/") )
sUserFilesPath += "/" ;
}
return sUserFilesPath ;
}
}
从上面的注释可以看到用户上传路径的顺序,只要在页面加载的时候设置下Session["FCKeditor:UserFilesPath"]就可以设置FCKeditor上用户上传路径了

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Session["FCKeditor:UserFilesPath"] = "/townfile/55/";
string sImageBrowserURL = "/townfile/55/";
FCKeditor1.ImageBrowserURL = sImageBrowserURL;
///这边的55代表多用户系统中一个用户的ID号。。。。
这样就实现了只能浏览自己的文件,同时在自己的目录下上传文件喽。

 在配置的时候关闭了文件浏览,只提供文件快速上传 但是在使用的时候如果“"/townfile/55/”中的”55“路径没创建,上传中FCKeditor它不会创建,也导致了文件无法上传成功,那就需要再修改FCKeditor.net项目中的Uploader.cs文件,添加一段文件夹存在的检测代码,如果不存在用户指定的文件夹侧创建一个。。。这个操作已经几乎不是问题了
}
}
 回复 引用   

补充下,上面那个是实现图片的分用户系统上传控制,
但是在此设置方法 通用于Image,Flash和Link类的浏览目录怎么办呢?
我网上查了下Fckeditor属性中有:
FCKeditor1.ImageBrowserURL = sImageBrowserURL;
FCKeditor1.LinkBrowserURL = sLinkBrowserURL;
FCKeditor1.FlashBrowserURL = sFlashBrowserURL;
但是”FlashBrowserURL“这个属性是不存在的,要是这个功能解决,我们就可以把Fckedtior 在多用户系统下的功能全部集中在一起,让更多的人少走弯路。剩下的就是Fckeditor的文件管理喽。。。这个问题等我们把上面的问题搞定了再一起总结下
 回复 引用   

#29楼[楼主] 2008-11-08 11:55 朱博      
@ZHAOYN
你的校验代码应该没错,问题是当图片稍微大点的时候,当它还未加载完毕你就去获取它的fileSize属性,值就是-1了。你得增加图片加载是否完成的判断。
 回复 引用 查看   

#30楼[楼主] 2008-11-08 12:10 朱博      
@hupeichuan
兄弟你好勤奋:)

通过设置Session["FCKeditor:UserFilesPath"]的确可以达到你要得效果,但这同时也破坏了原有程序要生成基于日期或者Guid生成子目录的功能。

比较好的办法还是要改造一下FCKeditor.Net,比如给FredCK.FCKeditorV2.FileBrowser.StoreScheme加入一个参数,%userid,来标识使用用户ID作为子目录。

这样就不会遇到目录未创建的情况,因为我原来的逻辑已经实现了目录自动创建的逻辑:
FredCK.FCKeditorV2.FileBrowser.FileWorkerBase.FileFolderOnTheBasisOfPattern

对于Flash和Link我没有过多考虑,我改造的FCKeditor.Net_2.6.3也仅仅针对Image测试通过。
 回复 引用 查看   

@朱博
呵呵,哥们,我也是基于兴趣呵呵,我对程序比较敏感,会冲动。哈哈
 回复 引用   

朱博兄弟,能否把FCKeditor再改进下,可以分用户上传浏览文件,就像你在web.config配置下就很方便了,使用起来很简单。谢谢
 回复 引用   

#33楼[楼主] 2008-11-09 19:02 朱博      
@hupeichuan
好的,我最近抽时间做一下给各位分享。
 回复 引用 查看   

@朱博
哥们,你太棒了,太期待了,我最近开发的项目就需要这样的功能噢
 回复 引用   

朱博 ,我也来支持,FCKeditor 这个控件要是分用户能浏览上传的话多好噢在网上查了很久都没找到
 回复 引用   

#36楼[楼主] 2008-11-11 11:42 朱博      
@hupeichuan
@向左向右

已经可以通过配置Web.config根据当前登录用户的标识来使用不同的图片上传目录了。

但仅仅针对图片上传。其他类型文件上传、浏览均未实现,有兴趣的朋友可以完善一下。
 回复 引用 查看   

@朱博
迫不及待,看看先
 回复 引用   

@朱博
哥们,请问你一下,如果要做个多用户新闻发布系统的话,可以动态创建栏目,栏目下有文章,要是想实现删除栏目,把文章的数据也删除的话这个不是问题,如果用到Fckeditor在线编辑器的话,删除栏目同时把栏目下的文章删除并删除文章的附件比如“FLASH,图片”等等。这样怎么实现呢?
 回复 引用   

@朱博
我是这样实现的。因为是多用户管理系统的附件控制比较严格,各自发布的信息隔离的比较好。比如用户标识55,创建了栏目10,同时在栏目下发表了图文混排文章,那么就会在发表有附带图片的文章的时候创建了55/10/yy/mm/dd/文件名。因此在删除栏目的时候删除数据库数据并且利用IO操作来删除10文件夹下的所有的目录和文件。
LoginedUserIdentifier = "44"; 这边能否以编程的形式来赋值,比如44/10
“44”是用户标识,”10“是栏目文件夹的名称
 回复 引用   

#40楼[楼主] 2008-11-11 12:47 朱博      
@hupeichuan
你的办法挺好的。

还有一种办法,文章中包含的媒体文件(图片、视频、其他文件……)记录在一个表里面,当删除文章时,媒体文件一并删除即可。

这需要在上传媒体文件时就增加相应的逻辑去记录,通过修改FCKeditor是可以做到的。
 回复 引用 查看   

@朱博
“还有一种办法,文章中包含的媒体文件(图片、视频、其他文件……)记录在一个表里面,当删除文章时,媒体文件一并删除即可。
这需要在上传媒体文件时就增加相应的逻辑去记录,通过修改FCKeditor是可以做到的。

我以前想过这样的方式实现看下是不是很你一样的?
比如
新闻表news(id,message,....)
建立一张数据库表如attachment(id,newid,path)
这两张表建立外键约束,message是新闻内容,可以是图文混排的。message
字段的数据比如是:XXX[img]3[/img]YYY[img]4[/img] 这里的3和4是对应的attachment表里面的主键id,因此在读取新闻的时候利用正则表达式提取所有[img][/img]的内容,即可得到该文章包含的所以附件ID---》再选择出附件的URL,很容易得到图文混排。不过对文章删除的时候因为建立了外键约束只能把附件表attachment里面相关的数据给删除,并没有删除磁盘里面的文件。会造成垃圾文件
 回复 引用   

补充下:

删除文章的时候首先找出attachment表里面的相关附件的URL,删除文件--------->删除附件表的数据----->最后删除文章
只是是这样的执行顺利。要是先删除新闻表或是附件表数据的话会导致找不到附件的路径。。。
这样是个办法,不过存在个问题附件删除的期间出现了异常有可能会造成附件删除了但是接下来执行的删除数据库附件表数据和新闻表数据还存在。导致文章存在附件却没有喽。。。
呵呵
朋友,你有什么高招?
 回复 引用   

#43楼[楼主] 2008-11-13 09:49 朱博      
@hupeichuan
我的方法和你的方法是一样的,就是先根据attachment表中记录的附件路径将其删除后再删除附件表数据、新闻表数据。

你可以在可能出问题的地方try catch一下,保证其出错也不会影响后面的代码执行。

不过这个方法也有不足,如果用户修改文章时删除了某些图片,是不能同时把删除的图片删除掉的。
 回复 引用 查看   

@朱博
不过这个方法也有不足,如果用户修改文章时删除了某些图片,是不能同时把删除的图片删除掉的。

恩, 认可,我也是遇到这样的问题
 回复 引用   

#45楼 2008-12-05 15:16 Theo      
我按照你博客里的配置了config文件,就是加 <add key="FCKeditor:FolderPattern" value="%y/%m/%d/"/><add key="FCKeditor:UploadedFilesDomain" value="http://www.aa.com/"/>
但是为什么上传的图片还是显示的相对路径,也没有按日期分文件夹呢,而且上传后显示的相对路径是加了我的项目名称的(我是本地测试),比如我是http://localhost/Solution1/aa.aspx,上传后的图片路径是/Solution1/fckimg/1.jpg了,望帮忙一下,很急,先谢谢了
 回复 引用 查看   

#46楼 2008-12-06 10:08 theomi[未注册用户]
楼主,很急啊,这个问题怎么解决啊,恳请看到后帮帮忙
 回复 引用   

#47楼[楼主] 2008-12-06 18:10 朱博      
@Theo
请先确认一下你网站Bin目录下面的FredCK.FCKeditorV2.dll是使用的http://files.cnblogs.com/zhubo/FredCK.FCKeditorV2_20081111.rar么

还有你的FCKeditor版本是否2.6.3?
 回复 引用 查看   

#48楼 2008-12-08 09:04 theomi[未注册用户]
我是在官网下载的,2.63的,源码是.net的``
 回复 引用   

#49楼 2008-12-08 09:22 theomi[未注册用户]
哦,真谢谢,用你给的地址里的DLL可以了,非常感谢
不过我有一点不明白, 怎么我到官方下的最新版的不行呢,DLL是.net源码版里的
 回复 引用   

#50楼[楼主] 2008-12-08 09:33 朱博      
@theomi
因为这些功能不是 FCKeditor.NET 2.6.3 本来具有的功能,是我后来扩展的。
 回复 引用 查看   

首先谢谢楼主,我使用了你的控件。
现在我遇到的问题是,我要自定义上传后图片URL中的域名。按你所指导的做了,可还是显示不出图片。图片会变成叉号。找不到。请问是什么缘故。
 回复 引用   

#52楼[楼主] 2009-05-21 10:13 朱博      
@huaxiaoyao
不用客气,分享是一种乐趣。

问题1:你设定的域名是什么?
问题2:请在叉号上点击右键 > 属性,看到的URL是什么?

请回答一下上面2个问题,我看是什么原因。
 回复 引用 查看   

改造的不错,就是上传的时候,选择的文件上传之后如果选择的是生成的文件夹(即在生成的文件夹中选择了上传,那么又再次生成文件夹),如果这个问题能解决就更完美了
 回复 引用   

楼主提供的DLL,当设置FCKeditor:MaxWidthOfUploadedImg时有个问题,GIF图片背景色出问题。
 回复 引用   

#55楼[楼主] 2009-06-05 17:12 朱博      
@股票兔
谢谢提醒。

设置FCKeditor:MaxWidthOfUploadedImg,实质上是将图片采用JPEG的方式压缩了,所以就导致GIF图片的透明背景色出现了问题。我试试看有没有更好的方法,如果有,会及时更新。
 回复 引用 查看   

#56楼[楼主] 2009-06-08 18:22 朱博      
@egghead008
不好意思,我没有看明白您的意思。您是说如果从文件上传目的文件夹中选择,又要再次生成该文件夹?您是在WebServer上做的实验对么?
 回复 引用 查看   

--引用--------------------------------------------------
朱博: @股票兔
谢谢提醒。

设置FCKeditor:MaxWidthOfUploadedImg,实质上是将图片采用JPEG的方式压缩了,所以就导致GIF图片的透明背景色出现了问题。我试试看有没有更好的方法,如果有,会及时更新。
--------------------------------------------------------
期待。急用。请更新后尽快公告
 回复 引用   

#58楼 2009-07-03 18:08 新手中的新手
LZ的东西果然好,自己本来想直接改源码的,无奈今天下的源码都是解压缩的时候出错,不知道什么原因, 就用了LZ的DLL,出现了点问题,不知道LZ能否帮忙看下:
 回复 引用   

#59楼[楼主] 2009-07-03 18:13 朱博      
@新手中的新手
没问题,请把问题的现象描述一下。
 回复 引用 查看   

#60楼 2009-07-03 18:13 新手中的新手
不小心发掉了,不好意思。。嘿嘿。
web.config文件里面如下设置:<add key="FCKeditor:UserFilesPath" value="~/upload/image/"/>
然后再上传图片的时候路径就变成这样:/AllAspNet/upload/image//6044404c-38cc-4c4b-9455-a941a00b8732.bmp
就是在文件名前面多了个“/” 很奇怪。。。配置文件里面上传路径尾部改的少了一个“/”测试仍然是这样。。不知道什么地方出了问题,望LZ能帮助我解决下。万分感激了!
 回复 引用   

#61楼[楼主] 2009-07-03 18:22 朱博      
将配置:<add key="FCKeditor:UserFilesPath" value="~/upload/image/"/>改为:
<add key="FCKeditor:UserFilesPath" value="/AllAspNet/upload/image/"/>即可
 回复 引用 查看   

#62楼 2009-07-03 18:24 新手中的新手
T_T 问题依然, 是不是我的DLL和fckeditor文件夹里面的不匹配的原因啊?
 回复 引用   

#63楼 2009-07-03 23:32 新手中的新手
好了,问题解决了。。。。
因为上传路径总会由FileFolderOnTheBasisOfPattern(String sServerDir)方法来构造,这里面有个字段String path 读取的是Config.FolderPattern 属性,在Config类里面关于FolderPattern属性是根据一系列的方法来构建的,最后一个重要的地方就是:
if (!folderPattern.EndsWith("/"))
folderPattern += "/";
这里面folderPattern其实就是获取自定义路径。但是我并不想要自定义一个路径,所以这里取到的folderPattern="" ,所以这句就执行了,那么自定义路径就变成了“/”,本来我没有自定义路径,这个folderPattern应该为空或者"" ,然后这个folderPattern又和后面的文件名拼接,组成新的路径,加上前面获取了真实的物理路径,就变成了:
/AllAspNet/upload/image//6044404c-38cc-4c4b-9455-a941a00b8732.bmp
这种情况。。。。这个....image//6044404c....中间多出来的“/”就是前面的原因造成的,也就是因为我没自定义一个路径造成的,所以我把LZ的东西稍微改了下,把
if (!folderPattern.EndsWith("/"))
folderPattern += "/";
加了个判断,改成:
if (!folderPattern.EndsWith("/") && folderPattern!="")
folderPattern += "/";
判断是否我给出了一个自定义路径,当然这是根据我自己的需求来改的。。
经测试是可行的。。。问题都解决了。
感谢LZ分享的修改版本,省去了我很多时间,有很多东西我自己也不会,顺便也从LZ这里学了不少东西!
 回复 引用   

#64楼[楼主] 2009-07-06 09:40 朱博      
@新手中的新手
非常感谢。这个Bug我已修正,并更新了源码。
 回复 引用 查看   

#65楼 2009-07-22 11:20 追梦浪子      
实在是太有帮助了!我还有一个问题想请问LZ一下,就是如何获得我上传的文件的名字啊?(例:图片包括格式,还有文档的名字)!期待着LZ的帮助!谢谢啦!
 回复 引用 查看   

#66楼 2009-07-29 13:34 sajh[未注册用户]
很奇怪啊,我把你的源码包和dll下过去 ,打开以后,再加载fckeditor.dll,页面控件加载不成功,加载不了控件
 回复 引用   

#67楼[楼主] 2009-07-30 09:59 朱博      
@追梦浪子
请问你想在哪里获得上传文件的名字?FCKeditor的上传文件界面?还是别的什么地方?
 回复 引用 查看   

#68楼[楼主] 2009-07-30 10:02 朱博      
@sajh
“打开以后,再加载fckeditor.dll,页面控件加载不成功”,能描述地再具体一点么?

* 在哪里加载dll?
* fckeditor.dll是不存在的,正确的文件名是“FredCK.FCKeditorV2.dll”
* 哪里页面控件加载不成功?
 回复 引用 查看   

#69楼 2009-07-31 13:29 sajh[未注册用户]
直接在工具箱直接加载这个FredCK.FCKeditorV2.dll,加载以后,直接把这个控件 拉到页面的时候 说不能创建此控件,我用的项目是直接从你这里下的,不是配置好啦的吗?
 回复 引用   

#70楼[楼主] 2009-07-31 13:48 朱博      
@sajh
原来是这样,搏软狂歌有篇文章:FCKeditor2.2+ASP.NET2.0不完全攻略,详细介绍了FCKeditor的基本使用方法,你可以先从这里参考一下。
 回复 引用 查看   

#71楼[楼主] 2009-07-31 13:51 朱博      
@sajh
为了方便你查阅,我把你遇到的这个问题的解决方法摘录如下:

--------------------

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

--------------------

IDE自动生成的代码:

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

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


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

为什么我上传图片的时候 点上传到服务器 的那个按钮没有反映?
 回复 引用   

#73楼[楼主] 2009-07-31 18:02 朱博      
@上传图片
这个原因比较复杂,我一时想不出来,不过能确定的是如果你都一条一条按照我的示例配置来做,且编辑器代码部分使用FCK2.3.2或以上,应该是没问题的。

你的问题给了我启发,如果因为程序错误(500),FCKeditor的图片上传没有什么错误提示,我可以增加一个错误提示的改进,但我不能保证开发完成的时间,请理解。
 回复 引用 查看   

谢谢 博主 对我的问题解答. 但是我现在对你提供的源码,还不知道怎么使用! 你能不能加下我的 QQ? Q:419794967 不胜感激...
 回复 引用 查看   

你的源码是不是和项目是同一级别的? 你提供的源码文件是否都要添加到项目里面?
 回复 引用 查看   

#76楼[楼主] 2009-08-03 22:29 朱博      
@白了头发就是代价
我提供的源码只是FCKeditor.Net的,不需要加到项目里面,你只需要引用FredCK.FCKeditorV2.dll即可。

我做了一个完整的Demo:http://files.cnblogs.com/zhubo/FCKeditorDemoForCSharp.zip,你可以下载来试试看。
 回复 引用 查看   

#77楼 2009-08-04 10:25 追梦浪子      
@朱博
实在不好意思!这么迟的回复您!我就是,在文本中添加一张图片,我想得到这个图片的名称,路径!因为我要单独建立一个字段!这样在前台显示的时候,我可以显示出文本中的图片和标题!点击然后再看到文本详细内容!
 回复 引用 查看   

谢谢博主 提供的源码! 我的问题已经解决了。。 万分感谢!!
 回复 引用 查看   

#79楼[楼主] 2009-08-04 23:22 朱博      
@追梦浪子
想法真的很好,实现也可以,但我不建议你这样做,因为有一些很难解决的问题:如果正文中有多于1张的图片,用哪张图片的路径来填充这个字段?另外,如果修改文本时,要在正文中删除掉这张图片,怎么删除存储在字段中的值?

建议你换一种做法:在表单中专门做一个上传控件,该控件上传图片后暂存图片URL,提交表单时存储该字段;如果要删除图片,也可在数据库中删除该字段的值,这样更容易实现。

不过如果要研究如何获得上传图片内容的话,方法如下:

当使用FCKeditor上传图片成功后,实际上是由/FCKeditor_2.6.4.1/editor/filemanager/connectors/aspx/upload.aspx?Type=Image返回了一段JS:

<script type="text/javascript">window.parent.OnUploadCompleted(0,'/UploadFile/UserFiles/2009/8-4/da99ed94-21e0-4b90-aa70-80616e2b6625.jpg','da99ed94-21e0-4b90-aa70-80616e2b6625.jpg','') ;</script>

这时,我们就从图片上传对话框里面看到了上传成功的图片。

据此,可以修改/FCKeditor_2.6.4.1/editor/filemanager/connectors/aspx/upload.aspx?Type=Image,改造一下这段JS:

假设存储图片URL的控件ID是:hidImgUrl,返回JS修改为:

<script type="text/javascript">window.parent.parent.document.getElementById("hidImgUrl").value = "/UploadFile/UserFiles/2009/8-4/da99ed94-21e0-4b90-aa70-80616e2b6625.jpg"; window.parent.OnUploadCompleted(0,'/UploadFile/UserFiles/2009/8-4/da99ed94-21e0-4b90-aa70-80616e2b6625.jpg','da99ed94-21e0-4b90-aa70-80616e2b6625.jpg','') ;</script>

即可将上传成功图片的URL传给hidImgUrl

注:代码未经测试,这里仅供参考。
 回复 引用 查看   

#80楼 2009-08-06 08:47 追梦浪子      
@朱博
我实在是太感谢你了,多谢了!你的这个方法我受益匪浅!我会努力的去实践你的这一方法!谢谢!
 回复 引用 查看   

您好!

您说为了加快页面的渲染,我们可以把图片等静态资源放在一个独立的域名当中。但FCKeditor默认的图片上传后URL是相对路径

为什么放在独立的域名中可以加快页面的渲染,我比较菜呵呵,不是很明白这个原理.

还有我在IIS上新建了个网站:然后配置:
<add key="FCKeditor:UploadedFilesDomain" value="http://localhost:99/"/>

是不是一定要域名才有效果,呵呵,我不是很懂,莫怪.


 回复 引用   

#82楼[楼主] 2009-09-14 01:02 朱博      
各个版本的IE都对同一域名下同时加载资源有数量为2的限制,假设你的网站有20个图片,IE需要分十次,每次2个下载,这会降低页面的渲染速度。但如果你用单独的1个域名来显示图片,理论上,页面渲染速度是原来的2倍。

但并不是域名越多越好,域名多了,会增加每一次HTTP访问时的DNS查询时间,一个未成文的标准是4-8个域名为最佳。

给你一个参考:http://www.cnblogs.com/yslow/archive/2009/05/20/1467373.html

另外我文中提到的独立域名,指的是连根域名都不同,比如www.a.com的图片用域名b.com来显示,这是因为如果你的网站不注意控制cookie的大小(有时候是没办法控制,因为各种广告管理系统、站点统计系统都会增加cookie的大小),会让你域名下的所有资源(包括图片、JS、CSS……)都有一段Cookie的信息,增加不必要的流量、计算资源支出。如果你采用了与根域不同的域名来显示图片等资源,这个问题就不存在了。

引用兜兜里有糖:
您好!

您说为了加快页面的渲染,我们可以把图片等静态资源放在一个独立的域名当中。但FCKeditor默认的图片上传后URL是相对路径

为什么放在独立的域名中可以加快页面的渲染,我比较菜呵呵,不是很明白这个原理.

还有我在IIS上新建了个网站:然后配置:
<add key="FCKeditor:UploadedFilesDomain" value="http://localhost:99/"/>

是不是一定要域名才有效果,呵呵,我不是很懂,莫怪.



 回复 引用 查看   

#83楼 2009-09-14 12:16 sajh[未注册用户]
谢谢前面的指导,我已经配置成功啦,但现在我使用你提供给你们的那个fckeditor的配置上传图片,怎么总是在显示读取进度条?网上查啦很多原因,都 是说要把 <add key="FCKeditor:UserFilesPath" value="/UploadFile/UserFiles/"/>改成 <add key="FCKeditor:UserFilesPath" value="~/UploadFile/UserFiles/"/>就可以成功上传,我也这样设置啦,结果 成功,但看你给我那个不完全攻略,说以后上传到服务器还是要改回来?请问这是怎么回事
 回复 引用   

#84楼[楼主] 2009-09-15 23:44 朱博      
我估计您的测试环境是类似这样的URL:http://localhost/YourVirtualDir/
假设您的图片文件夹的URL是:http://localhost/YourVirtualDir/UploadFile/UserFiles/,如果在测试环境下,使用配置:

<add key="FCKeditor:UserFilesPath" value="/UploadFile/UserFiles/"/>的话,您的图片URL就变成了http://localhost/UploadFile/UserFiles/

但在生产服务器,基本上我们的根目录就是网站根目录,所以可以使用前面的配置。

引用sajh:谢谢前面的指导,我已经配置成功啦,但现在我使用你提供给你们的那个fckeditor的配置上传图片,怎么总是在显示读取进度条?网上查啦很多原因,都 是说要把 <add key="FCKeditor:UserFilesPath" value="/UploadFile/UserFiles/"/>改成 <add key="FCKeditor:UserFilesPath" value="~/UploadFile/UserFiles/"/>就可以成功上传,我也这样设置啦,结果 成功,但看你给我那个不完全攻略,说以后上传到服务器还是要改回来?请问这是怎么回事

 回复 引用 查看   

#85楼 2009-09-18 19:21 sajh[未注册用户]
非常感谢,这个已经解决啦,就是现在如果 我直接从word中粘贴东西到fck里的话,如果只是文字和表格的没有任何问题,但word有图片的话,图片就没办法粘贴过去 ,请问这个有什么办能解决吗?
 回复 引用   

#86楼[楼主] 2009-09-21 09:27 朱博      
这样的功能我没有自己实现过,有的插件可以,可以来这里找找看:
http://sourceforge.net/tracker/?words=tracker_browse&sort=open_date&sortdir=desc&offset=0&group_id=75348&atid=737639

另外我在国内有个论坛上也见过类似的讨论,供参考:http://bbs.kycms.com/showtopic-3145.html

引用sajh:非常感谢,这个已经解决啦,就是现在如果 我直接从word中粘贴东西到fck里的话,如果只是文字和表格的没有任何问题,但word有图片的话,图片就没办法粘贴过去 ,请问这个有什么办能解决吗?

 回复 引用 查看   

#87楼 2011-03-23 10:44 Mr Li      
这个有文件上传的大小限制吗?如果有的话怎么在web.config里配置。
 回复 引用 查看   

#88楼[楼主] 2011-03-24 16:40 朱博      
引用Mr Li:这个有文件上传的大小限制吗?如果有的话怎么在web.config里配置。

抱歉,没有文件上传大小的限制。
 回复 引用 查看   

#89楼 2011-08-16 18:24 班哥静听      
大哥 我现在项目里也需要实现将图片上传到其他域名的功能,我用的是你的dll,fck也是2.6.3的但为什么还是不成功啊,小弟很菜不会配啊,请大哥帮帮忙
 回复 引用 查看   

困扰了我4个小时的问题,在看了你这篇文章之后豁然开朗的,那些直接copy你文章然后以自己名义发表的人真可恨,加了这句话之后(<add key="FCKeditor:UploadedFilesDomain"value="http://image.xx.com/"/>)始终不起作用 从2.4.4的版本换到2.6.3 最后换到2.6.6 后来又回到2.6.3 还是不起作用 在看了你的修改的源码之后,我总总算明白了。问题终于解决了 谢谢!
 回复 引用 查看   

#91楼[楼主] 2011-08-19 17:39 朱博      
@班哥静听
试试FCKEditor2.6.6?要保证是官网下载,没有修改过的,应该能行。
 回复 引用 查看   

#92楼[楼主] 2011-08-19 17:39 朱博      
@图图学技术(&#208;&#244;τ&#209;&#232;τ)
呵呵,解决了就好啊。
 回复 引用 查看   

#93楼 2011-08-22 11:08 xiayibu      
在ckfinder.html页面,怎么按用户区分上传的图片?谢谢
 回复 引用 查看   

#94楼[楼主] 2011-08-23 10:41 朱博      
@xiayibu
抱歉,ckfinder我没有研究过。
 回复 引用 查看   

#95楼 2011-12-23 15:55 edmon      
请问在Web项目中引用可以正常应用web.config里的设置,但在WEB站点中应用web.config里的设置不生效,如何解决!
 回复 引用 查看