Typecho最新开发版附件上传失败的解决办法

in 技术分享 with 5 comments

心血来潮想写博客,一直都很喜欢轻量简洁,无疑Typecho是一个非常不错的选择,服务器和域名准备多年终于可以派上用场了,安装的过程还算顺利,没啥难度,在写下第一篇文章的时候却发现文件死活无法上传显示上传失败,愁死宝宝了...

一开始还以为是目录权限的问题,给uploads 777的权限,但是发现问题依旧,开始怀疑不是权限的问题而是代码的问题,因为是开发版的原因,有点BUG在所难免,开始跟踪上传的的过程。

按设计上传成功后应该返回附件信息的数组,但实际是返回了False,经过跟踪发现在

    /** /var/Widget/Upload.php 97行左右 **/
    
    if (!self::checkFileType($ext) || Typecho_Common::isAppEngine()) {
        return false;
    }

运行到这里返回了False,checkFileType返回的是文件的类型(后缀),这里是没有问题的,基本可以定位到问题是出现在Typecho_Common::isAppEngine()上面了,继续跟踪代码

    /** /var/Typecho/Common.php 824行左右 **/

    public static function isAppEngine()
    {
        return !empty($_SERVER['HTTP_APPNAME'])                     // SAE
            || !!getenv('HTTP_BAE_ENV_APPID')                       // BAE
            || !!getenv('SERVER_SOFTWARE')                          // BAE 3.0
            || (ini_get('acl.app_id') && class_exists('Alibaba'))   // ACE
            || (isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'],'Google App Engine') !== false) // GAE;
    }

这个函数的作用是检测是否在app engine上运行,屏蔽某些功能,问题就是出现在这个函数里了,BAE3.0的判断代码

    !!getenv('SERVER_SOFTWARE') 

获取的并不是BAE3.0独有的环境变量,而是获取了服务器的通用标识,在任何服务器上运行基本都会返回True,经过二次取返后返回True,于是乎程序就认为是运行在BAE 3.0的环境而屏蔽了上传功能,最终导致了上传失败,既然知道问题所在,那么修复起来就很简单了,只需要将

     !!getenv('SERVER_SOFTWARE')  替换为  !!getenv('HTTP_BAE_LOGID') 

问题即可迎刃而解!

Responses
  1. 南风独舞

    博主你好!看了你的帖子,我也购买了跟你一模一样的配置来装机,发现根本不能装下两个3.5寸的机械盘。还望得到你的指点!!

    Reply
  2. jf

    不熟悉php,被这个问题搞了好多天,多谢你的分享

    Reply
    1. @jf

      不客气

      Reply
  3. 正确

    谢谢

    Reply
    1. @正确

      不客气

      Reply