首先说一下我的网站(www.rupeng.com)的结构,discuz论坛放在了网站根目录的forum目录下,论坛的附件目录并没有使用默认的/forum/ p_w_uploads,而是我把论坛附件也挪到了网站根目录的“/forum_p_w_uploads”下,因此我在discuz后台将【附件保存位置】修改为“./../forum_p_w_uploads”(discuz文档中说“相对目录务必以 "./" 开头”)。然后同时启用了“远程附件”。
经过上面的修改以后我发现当上传的附件超过“附件尺寸下限”的时候提示“附件文件无法保存到远程服务器,请与管理员联系”,也就是上传远程附件失败。经过调试discuz代码发现了问题所在,确认是discuz的Bug。
Bug在include/post.func.php的ftpupload函数中,如果是上传的远程附件,那么假设$source参数传过来的是“/www/users/cownew.com/forum/./../forum_p_w_uploads/month_0906/20090602_8af8as9dfas8du9823898898.rar”,后面的代码把$source传递给了dftp_put函数,但是好像dftp_put函数对这种有点复杂的路径“/www/users/cownew.com/forum/./../forum_p_w_uploads/month_0906/20090602_8af8as9dfas8du9823898898.rar”识别有Bug,因此我在ftpupload函数的一开始加入一句“$source=realpath($source)”来将这个复杂的相对路径转换为绝对路径。这样问题就解决了。
我采用的是康盛的虚拟主机,昨天晚上康盛的技术人员整个晚上都在帮我解决这个问题,虽然最终还是我自己发现discuz的这个Bug,但是还是非常感谢康盛的虚拟主机技术人员,他们非常尽职,而且服务器也非常稳定,用康盛的主机一年以来只碰到过两次持续时间不超过半小时的服务器被DDOS***和一次MYSQL故障,相对其他IDC来说稳定性已经非常好了,推荐大家使用康盛的IDC。