朱博的技术园

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

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  9 随笔 :: 0 文章 :: 144 评论 :: 2 引用

最新评论

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

恩, 认可,我也是遇到这样的问题
@hupeichuan
我的方法和你的方法是一样的,就是先根据attachment表中记录的附件路径将其删除后再删除附件表数据、新闻表数据。

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

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

删除文章的时候首先找出attachment表里面的相关附件的URL,删除文件--------->删除附件表的数据----->最后删除文章
只是是这样的执行顺利。要是先删除新闻表或是附件表数据的话会导致找不到附件的路径。。。
这样是个办法,不过存在个问题附件删除的期间出现了异常有可能会造成附件删除了但是接下来执行的删除数据库附件表数据和新闻表数据还存在。导致文章存在附件却没有喽。。。
呵呵
朋友,你有什么高招?
@朱博
“还有一种办法,文章中包含的媒体文件(图片、视频、其他文件……)记录在一个表里面,当删除文章时,媒体文件一并删除即可。
这需要在上传媒体文件时就增加相应的逻辑去记录,通过修改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里面相关的数据给删除,并没有删除磁盘里面的文件。会造成垃圾文件
@hupeichuan
你的办法挺好的。

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

这需要在上传媒体文件时就增加相应的逻辑去记录,通过修改FCKeditor是可以做到的。
@朱博
我是这样实现的。因为是多用户管理系统的附件控制比较严格,各自发布的信息隔离的比较好。比如用户标识55,创建了栏目10,同时在栏目下发表了图文混排文章,那么就会在发表有附带图片的文章的时候创建了55/10/yy/mm/dd/文件名。因此在删除栏目的时候删除数据库数据并且利用IO操作来删除10文件夹下的所有的目录和文件。
LoginedUserIdentifier = "44"; 这边能否以编程的形式来赋值,比如44/10
“44”是用户标识,”10“是栏目文件夹的名称
@朱博
哥们,请问你一下,如果要做个多用户新闻发布系统的话,可以动态创建栏目,栏目下有文章,要是想实现删除栏目,把文章的数据也删除的话这个不是问题,如果用到Fckeditor在线编辑器的话,删除栏目同时把栏目下的文章删除并删除文章的附件比如“FLASH,图片”等等。这样怎么实现呢?
@朱博
迫不及待,看看先
@hupeichuan
@向左向右

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

但仅仅针对图片上传。其他类型文件上传、浏览均未实现,有兴趣的朋友可以完善一下。
朱博 ,我也来支持,FCKeditor 这个控件要是分用户能浏览上传的话多好噢在网上查了很久都没找到
@朱博
哥们,你太棒了,太期待了,我最近开发的项目就需要这样的功能噢
@hupeichuan
好的,我最近抽时间做一下给各位分享。
@Garnett_KG
谢谢你的回应,但我没有明白你的意思,因为@SameTinyintFlag与@WideGapTinyintFlag的初始值是0,当@i > 50000 与@i > 97000 时进行@SameTinyintFlag=1及@WideGapTinyintFlag=1赋值,就是为了增加01数量相当与01数量悬殊的样本数据。

麻烦指正。
IF @i > 50000
SET @SameBitFlag = 1
SET @SameTinyintFlag = 1

IF @i > 97000
SET @WideGapBitFlag = 1
SET @WideGapTinyintFlag = 1

---

这样实际上插入的99999笔@SameTinyintFlag=1及@WideGapTinyintFlag=1的记录..

粗略的看了一下,发现测试数据有问题,下面的结论就没看了。

朱博兄弟,能否把FCKeditor再改进下,可以分用户上传浏览文件,就像你在web.config配置下就很方便了,使用起来很简单。谢谢
@朱博
呵呵,哥们,我也是基于兴趣呵呵,我对程序比较敏感,会冲动。哈哈
@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测试通过。
@ZHAOYN
你的校验代码应该没错,问题是当图片稍微大点的时候,当它还未加载完毕你就去获取它的fileSize属性,值就是-1了。你得增加图片加载是否完成的判断。
补充下,上面那个是实现图片的分用户系统上传控制,
但是在此设置方法 通用于Image,Flash和Link类的浏览目录怎么办呢?
我网上查了下Fckeditor属性中有:
FCKeditor1.ImageBrowserURL = sImageBrowserURL;
FCKeditor1.LinkBrowserURL = sLinkBrowserURL;
FCKeditor1.FlashBrowserURL = sFlashBrowserURL;
但是”FlashBrowserURL“这个属性是不存在的,要是这个功能解决,我们就可以把Fckedtior 在多用户系统下的功能全部集中在一起,让更多的人少走弯路。剩下的就是Fckeditor的文件管理喽。。。这个问题等我们把上面的问题搞定了再一起总结下
忙疯掉了,问题差不多解决了。。。

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文件,添加一段文件夹存在的检测代码,如果不存在用户指定的文件夹侧创建一个。。。这个操作已经几乎不是问题了
}
}
补充下:FCKConfig.ImageBrowser = true ;和FCKConfig.FlashBrowser = true ;要是同时设置为false的话,就不能浏览文件了,不知道实现只能浏览自己的目录难不难?
一切搞定,很棒。不过有个问题,能不能单独设置某个用户,比如有连个管理员的ID分别是55,56.那么能不能设置不通的管理员只能上传到自己的目录下,并且只能看下自己文件夹的文件?谢谢
朋友,原来是浏览器缓存的问题,晕的要死,我把IE缓存删除掉就可以了。现在我继续做你上面内容的操作看下
兄弟,你能不能把整个DEMO提供下,我以前用是的5版本的,你的功能确实很棒,但是我引用你给你的动态链接库,一直报错
请教一下。我想限制上传图片的大小控制在1M以内,应该怎么做。我用的是FCK2.6,在Dialog里的image/image.js里添加校验代码为什么不好用
就是new 一个image,然后指定src是本地路径,然后用image.fileSize始终是-1 ,不知道为什么,楼主能否给解决一下,另外我不想通过webConfig来限制大小,因为项目中其他部分也可能上传视频等。所以不能统一限制。
@LifeKiller
好建议,非常感谢。
提个建议。如果图片大小小于设定,那么应该就不要再重新拿 System.Drawing去画了。
不错的一个小技巧,多谢分享
谢谢了 去看看
@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的代码,应该会有办法。
有空的时候好好看看
如何在用户(多个个人用户)上传图片的时候,动态创建一个文件夹用来存放此个人用户的图片文件,当用户在插入图片和删除图片的时候也只能看到属于自己文件夹的图片,并管理他们的功能? 实现这个需要修改什么地方呢?
@胡枫
这样配置的确是不行,因为你的目录访问符不能超过你的站点根目录。如果需要上传到网站外的目录,你可以这样:

网站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/"/>

应该就可以了。
@自知
谢谢自知的答复。我当时服务器的目录权限做了,比如存放静态资源的目录不具有脚本执行权限,但后来发现FCKeditor的漏洞能让用户传文件到我网站的任意目录。之前做的安全配置直接无效,很是郁闷。
有个问题请教哦。比如我的网站使用fckeditor的目录是d:\abc\fckeditor\
我想上传到另外一个站点路径是d:\ccc\upload\这边。
需要怎么设置呢。如果用相对路径好像是访问不到的吧。两个不同的站点。不是同一个站点的。我试了试<add key="FCKeditor:UserFilesPath" value="../ccc/upload/fckeditor"/>这样是不行的。
@朱博
如果服务器是自己公司专用的,只放自己公司的网站则问题不大
我们做的是通用产品,出过一些问题,所以我们就把这里修改了,当然fckeditor只是一个上传webshell的途径,服务器的安全设置才是最重要的。
@canbeing
不错的建议。的确是要改程序的,在文中第八点所讲:“config.ascx 的 CheckAuthentication() 方法中,增加验证用户是否登录的逻辑”,这里就可以把要上传的目录动态设定好。

当然,如果要做到普适,也可以做一个选项,比如FCKeditor:UniqueFolderForUsers为true时,才设定用户的目录。
@菜菜灰
我暂时还没有遇到类似的需求,不过修改起来应该是同样的道理。你可以分析一下源码。
不错
不过有一点,如果有根据不同的用户来将文件传到不能目录的话,就还需要再改一个程序了。
是否能讲一下,扩展其他的插件,如插入内框架,插入视频等等~~
谢谢,非常有用~~
@自知
谢谢你的意见。但我不是太明白,除了管理员,用户有可能修改config.ascx?还是有其他的攻击方式?麻烦明示,谢谢。
关于安全的问题,主要是去掉源代码中的SetConfig()方法,并在config.ascx中去掉SetConfig()方法。如果可以在config.ascx中修改上传设置的话,危险始终会存在。
@AlphaWu
我看到你的了,你的更加侧重用户的选择,很棒。如果可以提供源码就更好了。
不错。我也对FckEditor进行了扩展,我主要扩展的是图片上传的时候添加水印和生产缩略图。
http://wupeng.cn/post/2008/10/15/FckEditor-enhance-the-image-upload-feature.aspx
不错 下次就按照你这个这么用
很好 学习了
共3页: 1 2 3 下一页