分类 默认分类 下的文章

typecho文件上传失败的解决方案


问题描述

在实用typecho博客系统书写文章的时候,在上传附件图片的时候,会出现图片上传之后,并没有显示上传成功。

正常上传成功如下

QQ截图20190204202950.jpg

而如果上传失败的话,是没有这个地址弹出框的,因此我们就没有办法在页面中引入上传的图片的地址。

一开始的时候,以为自己安装的问题,然后在本地搭建了虚拟的环境。

发现虚拟环境是可以正常上传文件的,

同样的安装资源,怎么就不行呢?

于是就各种百度,最多的解释就是,上传文件的一个配置文件有限制。

参考文章:

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') 

问题即可迎刃而解!

总结来说:
1,就是为上传文件存放的这个文件足够的读写权限
2,就是更改文件上传的限制