文章目錄
  1. 1. 初次猜测
  2. 2. 查看代码
  3. 3. 总结

先让那个我们看一下完成的报错信息:

1
SplFileObject::__construct(/opt/lampp/temp/php2eRbl4): failed to open stream

然后说明一下,这个问题的解决办法并不值得借鉴。

环境: Ubuntu16.04, lampp, php7

初次猜测

当然遇到这种问题我们首先想到的是文件权限问题。所以首先我修改了相应目录的权限:

1
sudo chmod -R 777 temp/

然后发现问题仍没有解决。然后百度了一下,发现大部分的说法也都是文件没有相应的权限。

查看代码

大致看了一下,temp文件下面是用来临时存放文件的。所以我们知道我们上传的图片应该是临时存到了temp文件下面,然后再通过$file中的move()修改文件保存路径。

然后我们通过打断点发现了一个问题,当第一次调用这个方法的时候,我们发现是有一个临时文件的

然后我们点击继续的时候发现还是会再走一遍这个方法,然后文件已经不存在了,所以就会报错。

所以我们的解决办法就是在
/thinkphp/thinkphp/library/think/File.php文件中加入以下代码:

1
2
3
if (!is_file($filename)) {
$myfile = fopen($filename, "w");
}

然后File的构造方法就会变成:

1
2
3
4
5
6
7
8
public function __construct($filename, $mode = 'r')
{
if (!is_file($filename)) {
$myfile = fopen($filename, "w");
}
parent::__construct($filename, $mode);
$this->filename = $this->getRealPath();
}

总结

因为我们修改了框架里的内容,我们知道这种方法只是饮鸩止渴,所以这一定不是解决这个问题的根本方法,所以需要我们继续研究这个问题。

文章目錄
  1. 1. 初次猜测
  2. 2. 查看代码
  3. 3. 总结