最近在对一个Discuz!NT论坛的老项目进行维护和二次开发,遇到了论坛无法上传头像的问题。在网上找了相当多的资料,发现解决的方法基本是无效的。虽然有的状况一样,但是没有解决方法,后来自己研究了下也总算是解决了这个问题。

首先说明下出现无法上传头像的具体症状,大概的症状有下面这几点:

  1. 使用Flash头像上传时,点击上传图片,然后显示“图片载入中,请稍后的提示信息”和上传进度的百分比,最后却是没有任何的反应。
  2. 网上有部分网友说到进度到10%就没有任何反应,其实只是部分情况,如果传大图片的话会显示其他进度百分百。
  3. 使用超级银光头像上传时,点击上传图片,上传会上传成功,但是随后的预览图片会显示三张不同尺寸的空白图片,头像依然没有任何变化。


再说下网上说的大部分情况,这里只做参考,毕竟我们的情况和下面关系不太大:

  1. 服务器文件夹权限问题
  2. UC通讯问题(Discuz!NT没有UC通讯)
  3. 所下载的论坛有问题

网上的说所的大部分情况都是PHP版的Discuz,自从2010年Discuz被腾讯收购以后,不仅Discuz!Nt论坛打不开,而且直到今天也都没有新版本更新。所以有些问题都不知道如何解决,只能自己摸索和研究!就像我遇到的这个Flash无法上传头像的问题,其实最后是需要更改下源代码的,网上基本找不到解决方法。

问题产生的原因分析和最终解决方法

主要原因是Discuz!Nt中是有启用URL重写,而项目代码中的Url重写模块有屏蔽掉上传头像的默认图片保存路径,如果访问了上传头像的默认图片路径,是无法打开的图片的,URL会被转移到首页,所以无论如何头像都无法上传成功。

我们看下论坛源码项目中Web.config配置文件对重写模块的配置:

<httpModules>
      <add type="Discuz.Forum.HttpModule, Discuz.Forum" name="HttpModule" />
    </httpModules>

然后我们在项目中打开自定义的HttpModule类(位置在Discuz.Forum/HttpModule.cs),我们找到下面这段代码(我的项目是在284行,大家自己搜索下):

else if (requestPath.StartsWith(forumPath + "upload/") || requestPath.StartsWith(forumPath + "space/upload/") || requestPath.StartsWith(forumPath + "avatars/upload/"))
{
    context.RewritePath(forumPath + "index.aspx");
    return;
}

我们可以看到在URL重写模块中,只要网页中请求的路径是"upload"、"space/upload/"和"avatars/upload/"这三个文件夹,那么就会将请求的URL重写到网站首页,导致无法获取正确的头像图片URL,错误的头像图片路径造成图片无法正常打开,所以上传头像后会毫无反应。

另外其中的"upload"文件夹和"avatars/upload/"文件夹都是和头像有关的,我们可以尝试下随便在这两个文件夹下放置一张图片,然后我们在浏览器中直接访问这张图片的URL,我们可以发现图片是打不开的,因为被做了URL重写。

所以最后我是将这段代码做了注释,运行论坛发现头像已经可以正常的上传了!


作者:十有三