这个问题,折磨了我半年,我现在只想愤怒骂街。我怎么都想不通,为什么一个头像上传还能看人品,只要是windows有些人可以。有些人却怎么都不行,而且在linux下又是完全正常的。甚至我还看见一个奇葩的杰奇二次开发者,通过js记录cookies方式来强制把头像写入,而且大多数环境下,杰奇1.8一直到2.3全部都是不成功的,不过我终于找到原因了,无比坑爹的原因。
首先说我的过程:
1.linux下能成功,windows下不成功, 我首先想到的是文件夹权限问题,杰奇涉及头像上传的文件夹是/files/system/avatar,但是我无论设置怎样的权限,仍然是上传不了,而且我发现,杰奇在修改头像的时候,第一步头像出现的时候,它还并没有写入数据库,而是处于缓存状态。缓存状态是什么概念,那就是存在一个缓存文件夹,然而我找不到。
2.于是我想到那种通过js配合几个文件强制写入方法,我并没有弄懂原理,但是可以确定的是,只有2.3版本可以使用,2.2下面没点卵用。但由于是唯一成功的方案,我不断尝试了很久,仍然是失败,所以后来选择放弃,甚至想过通过完全移植2.3的整个会员中心,然后仍然是失败的。
3.过了一段时间之后,我选择解密setavatar.php文件,并没有发现有什么不对,直到我解密tmpavatar.php文件之后,发现了惊人之处。
关键在这一段代码:
$uptmp = (0 < strlen(ini_get("upload_tmp_dir")) ? ini_get("upload_tmp_dir") : (0 < strlen($_ENV["TEMP"]) ? $_ENV["TEMP"] : (0 < strlen($_ENV["TMP"]) ? $_ENV["TMP"] : (strtolower(substr(PHP_OS, 0, 3)) == "win" ? "C:/WINDOWS/TEMP" : "/tmp"))));
它直接说明了C:/WINDOWS/TEMP这个路径,就是windows安装状态下,头像图片的缓存路径,那我第一时间就想到是不是这个文件的权限问题,于是很快按照网上的修改,并且意外的查询到php.ini中有一条这样的代码:
session.save_path="C:/WINDOWS/TEMP"
但是我本地由于是phpstudy一键环境,我打开php.ini之后,发现是不同的:
session.save_path="E:\phpStudy\tmp\tmp" //这是我本地的
我顿时就绝对问题就出在这里,然后首选给user用户读写C:/WINDOWS/TEMP权限,然后修改php.ini,满怀期待的重启环境,结果仍然不能上传头像,我......
所以我差点就放弃了,认为这个问题解决不了。
但是,我吃完饭冷静下来之后,注意到tmpavatar.php那个文件中代码的一个字段。
upload_tmp_dir
我觉得很眼熟好像在哪见过,果然搜索php.ini的时候,发现这这样一段话。
那么我就尝试百度了一下,结果发现有一句这样的。
upload_tmp_dir =C:/WINDOWS/TEMP
就和之前定义session.save_path差不多,那么我把这句话加入php.ini之后,再重启环境去上传头像。
是的成功了!!!
所以总得来说,杰奇cms在windows下无法上传头像的时候。
排除掉环境问题,源码问题,那就只剩下upload_tmp_dir没有定义了。
解决办法就是在php.ini里面加上这一句。
upload_tmp_dir =C:/WINDOWS/TEMP
好了,我辛苦写出来的教程在这里,可以转载但注明来源~~