CKFinder在PHP8.1环境下踩坑
后台-插件-广告管理-内容页头部广告(手机) |
环境描述:
PHP 8.1
CKFinder 4.0
背景:
插件从以前的程序移植的,一直运行良好,唯一差别是换了PHP8.1环境。
问题描述:
第1坑:
CKSource\CKFinder\Filesystem\File\UploadedFile::__construct(): Argument #1 ($uploadedFile) must be of type Symfony\Component\HttpFoundation\File\UploadedFile, array given, called in /data/www/chisu_font/ThinkPHP/Library/Vendor/Ckfinder/cksource/ckfinder/src/CKSource/CKFinder/Command/FileUpload.php on line 68
CKSource\CKFinder\Filesystem\File\UploadedFile::__construct(): Argument #1 ($uploadedFile) must be of type Symfony\Component\HttpFoundation\File\UploadedFile, array given, called in /data/www/chisu_font/ThinkPHP/Library/Vendor/Ckfinder/cksource/ckfinder/src/CKSource/CKFinder/Command/FileUpload.php on line 68- 1
这个问题是由于CKFinder引用了symfony框架,symfony框架版本是2.7的,太老了,不和新的PHP环境兼容。
相关的修复方案及问题讨论:
https://github.com/Largo/symfony-http-foundation/pull/1/commits/45e8d45a170f92e79fde915e8da71b8adc5471ba
https://github.com/symfony/symfony/issues/50624
参照第一个修改方案,在 /Ckfinder/symfony/http-foundation/FileBag.php 文件中的protected function fixPhpFilesArray($data)函数新增一行:
protected function fixPhpFilesArray($data) { unset($data['full_path']); if (!is_array($data)) { return $data; } $keys = array_keys($data); sort($keys); if (self::$fileKeys != $keys || !isset($data['name']) || !is_array($data['name'])) { return $data; } $files = $data; foreach (self::$fileKeys as $k) { unset($files[$k]); } foreach ($data['name'] as $key => $name) { $files[$key] = $this->fixPhpFilesArray(array( 'error' => $data['error'][$key], 'name' => $name, 'type' => $data['type'][$key], 'tmp_name' => $data['tmp_name'][$key], 'size' => $data['size'][$key], )); } return $files; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
第2坑:
$config_backends = $config->get(“backends”);
$config_root = $config_backends[0][‘root’];
上述代码无法取到配置数据,需要改用:
$config_root = $config_backends[‘default’][‘root’];
这块基本没影响,因为我原来自己写了文件重复的命名规则。
第3坑:
Unsupported image type (not resource): image/png
因为我测试程序是上传的图片,一直出这个错误,很费解。
调了半天,发现是PHP8.1把 imagecreatefromstring 函数返回值改了:https://www.php.net/manual/en/function.imagecreatefromstring.php
- 1
- 2
修改方案,修改 /Ckfinder/cksource/ckfinder/src/CKSource/CKFinder/Image.php
构造函数:public function __construct($imageData, $bmpSupport = false) 中
if (!is_resource($this->gdImage)) { throw new CKFinderException('Unsupported image type (not resource): ' . $this->mime); }- 1
- 2
- 3
修改成:
if ($this->gdImage === false) { throw new CKFinderException('Unsupported image type (not resource): ' . $this->mime); }- 1
- 2
- 3
总结:
(1)旧系统插件,新环境兼容性差,尽早换,或者自己写;
(2)PHP环境向前兼容做得不好。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |