Yii2-Redactor扩展问题[JS报错以及微信截图图片上传失败]

2019-05-05 703 Lei 0

我在使用Yii2的Redactor扩展项目时发现了几个问题,下面是我针对这几个问题提出的解决方案。

问题一

问题描述:

当还没有历史文件或者图片的时候,点击上传文件或者上传图片按钮,JS会报错。

注:Redactor在上传文件(包括图片)的时候,提供了历史文件的功能,可以从历史文件中选择需要的文件。

分析:

我们先看上传图片的错误。

报错代码所在文件是imagemanager.js,位置是:

报错原因是当没有历史数据的时候,后台返回null,而JQuery的$.each方法不能用于null。JQuery会报object.length出错,因为object是null。

所以我们只需要将后台返回的null改为返回空数组就可以解决问题了。

解决方案:

分析代码,代码的功能是在获取历史文件的信息,然后用于展示。我们去找PHP部分的相关代码。

文件位置在vendor/yiidoc/yii2-redactor下,其中相应的方法在该目录的actions目录下,此问题的相关文件应该是ImageManagerJsonAction.php。可以看到该文件的run方法如下:

缺少了最后的return [];因为没有历史文件的时候不会进入if语句,所以就直接结束了,前端JS获得的结果就是null,导致了异常。我们返回一个空的数组,就可以解决此问题了。

上面解决的是获取历史图片的错误,获取历史文件时是一样的道理,我们找到相关的PHP代码,同样返回空数组。获取历史文件设计到的文件是FileManagerJsonAction.php。

问题二

问题描述:

我的系统为win10系统,用微信截图,将截取的图片复制粘贴到桌面。上传该图片失败,提示“Unable to save image file”。

分析:

找到负责图片上传的代码ImageUploadAction.php,发现$model->upload()返回的是false,那么我们进入ImageUploadModel.php中的upload()方法,ImageUploadModel继承自FileUploadModel,使用的是父类的upload()方法,我们进入FileUploadModel.php的upload()方法。经过测试发现upload()方法中的$this->validate()返回的是false,所以应该是模型验证失败,打印了模型验证后的错误,发现是“只允许使用以下文件扩展名的文件:jpeg, jpg, png, gif。”我看了一下我上传的文件后缀名是.jpg。

那么问题就很清晰了,程序认为这个文件不是jpg格式的。我用文本文件打开这个图片后,发现是PNG格式。

将后缀名更改为png后,保存成功

我试了几次,当我编辑某张后缀名为.jpg的图片后,再保存微信截图,就会自动存储为jpg格式;如果我编辑某张后缀名为.png的图片后,那么我再保存微信截图,就会自动存储为png格式。

因此我怀疑Win10应该是有个特性:当你复制微信截屏的图片后,粘贴的时候,系统会根据你上次保存的图片格式后缀来保存你复制的这张图片。微信截图的图片都是png格式的,当保存为jpg的时候,就会导致以上异常。

解决方法:

微信截图确认保存为png就行了,微信截图的图片都是PNG格式的。

然后我们优化一下代码,当文件格式不正确的时候提示相应的错误(模型验证失败的时候提示失败信息),而不是返回“Unable to save image file”。

我们需要修改ImageUploadAction.php文件。修改如下:


同样,文件上传时,当模型验证失败,返回验证失败信息的修改如下:


相关阅读




  0