最近的项目用laravel-admin做开发,版本是1.8.11,发现了一个图片上传的问题,搜了一下好多人也遇到但是也没什么人贴解决方案,贴一下我的解决方法。
我遇到的问题就是:
添加一条记录的时候可以正常添加,图片也能正常保存。第二次要修改这条记录时,无论改没改这个图片,都无法保存。弹出来的错误提示是
Argument 1 passed to Encore\Admin\Form\Field\File::getStoreName() must be an instance of Symfony\Component\HttpFoundation\File\UploadedFile, null given, called in XXXX\vendor\encore\laravel-admin\src\Form\Field\Image.php on line XXX
大概就是说需要传一个对象,却给了字符串。
一看到是在encore里面报出来的错误,但是我的代码很简单,不太可能是调用出了问题。另外有很多人在论坛上吐槽这个问题,所以我估计这是一个bug.
$form->UEditor('title','标题');
$form->image('logo', '图标');
$form->UEditor('content', '内容');
$form->number('order', '排序');
$form->text('typesetting', '布局');
解决方法其实说出来也挺无奈的
- 1.降低版本 办公室的同事一个是1.7 一个是1.4 他们没有出现过个bug
- 2.自己写一个image拓展
写拓展之前首先要解决掉这个bug 我找到源码里面的image.php,给报错的地方加了个is_string的判断。
if(!is_string($image)){
$this->name = $this->getStoreName($image);
$this->callInterventionMethods($image->getRealPath());
$path = $this->uploadAndDeleteOriginal($image);
$this->uploadAndDeleteOriginalThumbnail($image);
return $path;
}else{
return $image;
}
运行之后没有问题 接着就是拓展了
复制整个文件Image.php,然后我把它放到App\Extension\Form下面,因为我加过uEditor的拓展,所以有这个目录,没有的可以自己建。
放进去之后改一下namespace和use 因为Image这个拓展是有其他依赖的,所以也要确保依赖引入是正确的。改完如下:
<?php
namespace App\Admin\Extension\Form;
use Encore\Admin\Form\Field\File;
use Encore\Admin\Form\Field\ImageField;
use Symfony\Component\Http\Foundation\File\UploadedFile;
class Image extends File
{
use ImageField;
/**
* {@inheritdoc}
*/ protected $view = 'admin::form.file';
/**
* Validation rules. * * @var string
*/ protected $rules = 'image';
/**
* @param array|UploadedFile $image
*
* @return string
*/ public function prepare($image)
{ if ($this->picker) {
return parent::prepare($image);
}
if (request()->has(static::FILE_DELETE_FLAG)) {
return $this->destroy();
}
if(!is_string($image)){
$this->name = $this->getStoreName($image);
$this->callInterventionMethods($image->getRealPath());
$path = $this->uploadAndDeleteOriginal($image);
$this->uploadAndDeleteOriginalThumbnail($image);
return $path;
}else{
return $image;
}
}
/**
* force file type to image. * * @param $file
*
* @return array|bool|int[]|string[]
*/ public function guessPreviewType($file)
{ $extra = parent::guessPreviewType($file);
$extra['type'] = 'image';
return $extra;
}
}
接着App\Admin\bootstrap.php改一下配置
Form::forget(['map', 'editor','image']);//原来的image加入到forget里面
Form::extend('image', AppAdminExtensionFormImage::class);//自己改过的image拓展加进来
我改一步之后就就好了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。