@hupeichuan
我的方法和你的方法是一样的,就是先根据attachment表中记录的附件路径将其删除后再删除附件表数据、新闻表数据。
你可以在可能出问题的地方try catch一下,保证其出错也不会影响后面的代码执行。
不过这个方法也有不足,如果用户修改文章时删除了某些图片,是不能同时把删除的图片删除掉的。
@hupeichuan
你的办法挺好的。
还有一种办法,文章中包含的媒体文件(图片、视频、其他文件……)记录在一个表里面,当删除文章时,媒体文件一并删除即可。
这需要在上传媒体文件时就增加相应的逻辑去记录,通过修改FCKeditor是可以做到的。
@hupeichuan
@向左向右
已经可以通过配置Web.config根据当前登录用户的标识来使用不同的图片上传目录了。
但仅仅针对图片上传。其他类型文件上传、浏览均未实现,有兴趣的朋友可以完善一下。
@hupeichuan
好的,我最近抽时间做一下给各位分享。
@Garnett_KG
谢谢你的回应,但我没有明白你的意思,因为@SameTinyintFlag与@WideGapTinyintFlag的初始值是0,当@i > 50000 与@i > 97000 时进行@SameTinyintFlag=1及@WideGapTinyintFlag=1赋值,就是为了增加01数量相当与01数量悬殊的样本数据。
麻烦指正。
@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了。你得增加图片加载是否完成的判断。
@Bēniaǒ
不敢当,前面也有朋友明白你的意思,只是他们没有明白说出来。
我现在主要在做博客发布系统与社交网络。用户体验很重要,这就必不可少客户端脚本与服务器端程序的交互。看得出来你挺注重标准的,我们互相学习。
@Bēniaǒ
ASP.NET让BS程序看起来好像有状态,其实是通过ViewState来保存状态的。如果你做过ASP之类的程序就能体会到。HTTP就只有GET、POST、PUT、DELETE四个动作,统统无状态。
@Bēniaǒ
明白你的意思了。问题在于基于http的程序不能在请求过程中操作。你可以把你的过程分解成 n 个 http 请求,在不同的请求开始前进行判断操作。
根据你的需求,这样就足够了,用户体验一点不会差。
拿你的例子来说:“比如在做业务系统的卡片里,当前卡片读取了一条数据显示在卡片上【已经完成了一次http请求】,此时用户已经对可片是的部分数据进行了修改,接下来当你不点保存而就直接去点新建操作的时候,就应该提示用户"当前数据已经修改,是否保存?"【不需要提交数据,直接用JS判断表单是否有改动,参见Gmail (发邮件时在邮件内容里面输入任意内容,再点击“Compose Mail”)】,根据用户的选择执行相应的操作(是:保存当前数据,将界面控件元素的值清空【按照我给你的示例代码,执行保存】,这个插入新的数据;否:不保存当前数据直接进入新增状态【同上一步】.).”
我不知道你的意思是不是点击确定与取消都可以执行相应的逻辑,如果是的话,下面的代码可以做到:
<!-- 定义属性为隐藏的样式 -->
<style type="text/css">
.Hidden { display: none; }
</style>
<!-- OnClick事件为确定或者取消逻辑 -->
<asp:Button CssClass="Hidden" ID="btnSave" runat="server" Text="保存" OnClick="btnSave_Click" />
<asp:Button CssClass="Hidden" ID="btnDiscard" runat="server" Text="取消并新建" OnClick="btnDiscard_Click" />
<!-- 客户端判断执行哪个按钮的点击事件 -->
<script type="text/javascript">
function SaveOrNot() {
var discard = confirm("您确定要放弃已经填写的内容么?");
if (discard) {
<%= btnDiscard.ClientID %>.click();
} else {
<%= btnSave.ClientID %>.click();
}
}
</script>
<!-- 在需要时调用方法 SaveOrNot() 即可 -->
@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的漏洞能让用户传文件到我网站的任意目录。之前做的安全配置直接无效,很是郁闷。
@canbeing
不错的建议。的确是要改程序的,在文中第八点所讲:“config.ascx 的 CheckAuthentication() 方法中,增加验证用户是否登录的逻辑”,这里就可以把要上传的目录动态设定好。
当然,如果要做到普适,也可以做一个选项,比如FCKeditor:UniqueFolderForUsers为true时,才设定用户的目录。
@菜菜灰
我暂时还没有遇到类似的需求,不过修改起来应该是同样的道理。你可以分析一下源码。
@自知
谢谢你的意见。但我不是太明白,除了管理员,用户有可能修改config.ascx?还是有其他的攻击方式?麻烦明示,谢谢。
@AlphaWu
我看到你的了,你的更加侧重用户的选择,很棒。如果可以提供源码就更好了。
@李华 顺
代码看着非常漂亮。很不错的方案。
如果把版本号放在配置文件里面就更好了。这个方案对于静态页面还是照顾不到,相比之下,12楼chunchun的方案在我看来更好。
@木子博客
的确是,但是使用动态资源还是不如静态资源效率高。楼下chunchun的方法很棒。
@Cat Chen
客户端的缓存我考虑到了,所以才需要对静态资源的URL进行修改,让客户端获得更新的资源;
服务器端的缓存如何做?还请详细指教。
@武眉博<活靶子.Net>
第一种办法有可能会造成样式表的修改历史在版本控制软件里丢失吧?
第二种方法不错,但对于静态的页面,不能获取配置文件值的页面来说,还是不行。
@wingoo
不太可能是手动改的,应该是自动处理的。手动改不可靠。
@爱在戏院前
即使换一个域名,浏览器也同样会缓存静态资源,除非定义header的cache-control为不缓存。但静态资源不缓存的话对带宽挺浪费的。
@fsy
BOINC项目我没有太多了解,但我觉得靠个人计算资源不太适合做企业应用。BOINC项目的经验应用在企业计算上,应该会有更快的发展。
@一个农民
Google的AppEngine就是一种很具体的尝试了,流量限制之内,免费;超过流量,收费。
公司不再需要购买硬件,购买带宽,只需要购买Google的云计算资源,这就是个大金矿。
至于其他的盈利模式,我们有待观察。
@Kevin Yu
很惭愧,作为ASP.NET的程序员,微软的会我一个都没有去过,我觉得微软肯定有自己的风格,以后有机会一定要参加一下,对于技术本身或技术之外的眼界开阔很有好处。
@hello blogger
我觉得这比较正常,讲的内容肯定都是已经发布的技术,不会像苹果大会那样很多功能是在会上给人一个惊喜。
对于学生来讲,这个会还是很好的;对于技术比较成熟的职业人士来讲,这样的会不能指望在技术上有什么新的收获,但能感受这些技术的幕后人士的激情、风采;能听一下原汁原味的介绍,本身就是一种收获。
可惜,因为第二天公司组织去泰山,没能参加晚上的活动。
@jjx
蒋兄么?很高兴看到你。
我的担心也是这一点,不过,appengine现在更多的是个偏重技术的平台,在这个平台上发布违法信息的技术成本还是太高,短时间内不必担心。
@梁逸晨
javascript是不需要google提供runtime的,你可以在页面里面直接写,至于php等环境,Google承诺陆续要支持,毕竟,现在的AppEngine还只是Preview阶段。
@Kevin Li
不好意思,录像没有,而且我参加的也只是OpenSocial与云计算的部分讲座,还不够全。随后,我会把拍到的PPT放出来,供各位分享。
@shenjk
很高兴能对你有所帮助。
我看了你的文章,方法很巧妙,但索引量比较大时会遇到严重的性能问题。不知shenjk是已经解决了还是还没有遇到。
若有解决性能的方法,还请不吝赐教。
@Cheney Shue
我没办法从理论上来分析这个事实成立的原因,从实验结果看,我的结论是成立的,也希望感兴趣的朋友能按照我的实验步骤来一次测试,可以数据量选择地更大一点。
感谢参与讨论。
@JoeLee
理论上讲,建立索引的原则是高选择性,低密度,但是从实验得出的数据来看,并不是这样,尤其是tinyint建立索引后对成本的消耗降低了近3倍,而这里仅仅只有10万条数据。
我没有在更大的数据量上做过测试,希望有兴趣的朋友可以试一下,验证一下我的结论是否成立。
谢谢参与讨论。
@Dove.Net
@梁逸晨
我也存在这个疑问,希望知道的朋友能分享一下
@大石头
貌似不是这样:
bit:如果一个表中有不多于 8 个的 bit 列,这些列将作为一个字节存储。如果表中有 9 到 16 个 bit 列,这些列将作为两个字节存储。更多列的情况依此类推。
tinyint:从 0 到 255 的整型数据。存储大小为 1 字节。
资料来源:SQL Server 联机丛书
@红尘
@国外软件
JetBrains dotTrace 2.0
@Jeffrey Zhao
我的这种方法适用的仅仅是替代按照时间倒序排列,其他类型的排序,暂时还没有更好的解决方法。
dangdang.com的图书搜索用的应该是Lucene,他们是怎么实现按照销量、上架时间等排序的,如果有dangdang的技术,可否给大家分享一下。
@没剑
对于文章类的数据来说,比如cnblogs的文章,一般情况下,先索引的是旧文章,后索引的是新文章,可以使用我的这种替代解决方案。
如果对于更为复杂一点的数据,这可能并不是好的办法。
更好的解决方案我还在研究中。
@wingoo
我这里没有考虑多个字段的排序,多个字段的排序还需要继续研究,如有好的办法,感谢分享
@红尘
JetBrains dotTrace 2.0