Yii2组件之多图上传插件FileInput的详细使用教程


Posted in PHP onJune 20, 2016

在前面给大家写个有关文件上传的文章,包括最基本的yii2文件上传、异步上传到又拍云以及百度编辑器图片上传的问题,貌似不说点多图上传的就不完美。

今天介绍一款多图上传的插件 FileInput,至于为什么选中了TA作为我们上传的插件,一来这货跟Yii2有一腿,用起来方便;二来嘛,用这个插件不仅添加的时候好操作,修改的时候也可以直接通过异步的方式将图片悄无声息的删掉;最值得一提的是,界面效果融合了bootstrap,清爽简洁美观,看起来舒服。

说重点,看具体步骤

首先还是先安装组件

composer require kartik-v/yii2-widget-fileinput "@dev"

先做一个必要的说明:假设我们有一张商品表,一张商品图片表,商品图片表只对商品id和图片地址进行存储

看基本使用

use kartik\file\FileInput;
// 非ActiveForm的表单
echo '<label class="control-label">图片</label>';
echo FileInput::widget([
'model' => $model,
'attribute' => 'image[]',
'options' => ['multiple' => true]
]);
//使用ActiveForm的表单
echo $form->field($model, 'image[]')->widget(FileInput::classname(), [
'options' => ['multiple' => true],
]);

上面上传多图,只需要设置multiple=true即可,记得选择图片的时候多选。

如此一来,图片选择好了直接提交表单就好,文件上传的程序需要自行处理,如果你还没有实现,可以参考文件上传的基本操作。

多图上传的唯一麻烦就是,修改的时候怎么才方便?不着急,FileInput都帮我们解决了!

我们看编辑的时候图片的展示以及如何异步的删除单个或者多个图片!

// 视图文件
use kartik\file\FileInput;
<?php $form = ActiveForm::begin([
'options' => ['enctype'=>'multipart/form-data'],
]); ?>
<?php 
echo $form->field($model, 'banner_url[]')->label('banner图')->widget(FileInput::classname(), [
'options' => ['multiple' => true],
'pluginOptions' => [
// 需要预览的文件格式
'previewFileType' => 'image',
// 预览的文件
'initialPreview' => ['图片1', '图片2', '图片3'],
// 需要展示的图片设置,比如图片的宽度等
'initialPreviewConfig' => ['width' => '120px'],
// 是否展示预览图
'initialPreviewAsData' => true,
// 异步上传的接口地址设置
'uploadUrl' => Url::toRoute(['/goods/async-image']),
// 异步上传需要携带的其他参数,比如商品id等
'uploadExtraData' => [
'goods_id' => $id,
],
'uploadAsync' => true,
// 最少上传的文件个数限制
'minFileCount' => 1,
// 最多上传的文件个数限制
'maxFileCount' => 10,
// 是否显示移除按钮,指input上面的移除按钮,非具体图片上的移除按钮
'showRemove' => true,
// 是否显示上传按钮,指input上面的上传按钮,非具体图片上的上传按钮
'showUpload' => true,
//是否显示[选择]按钮,指input上面的[选择]按钮,非具体图片上的上传按钮
'showBrowse' => true,
// 展示图片区域是否可点击选择多文件
'browseOnZoneClick' => true,
// 如果要设置具体图片上的移除、上传和展示按钮,需要设置该选项
'fileActionSettings' => [
// 设置具体图片的查看属性为false,默认为true
'showZoom' => false,
// 设置具体图片的上传属性为true,默认为true
'showUpload' => true,
// 设置具体图片的移除属性为true,默认为true
'showRemove' => true,
],
],
// 一些事件行为
'pluginEvents' => [
// 上传成功后的回调方法,需要的可查看data后再做具体操作,一般不需要设置
"fileuploaded" => "function (event, data, id, index) {
console.log(data);
}",
],
]);
?>
<?php ActiveForm::end(); ?>

如上所述,基本上都是组件 FileInput的基本属性和设置,我们这里也仅仅罗列了一些常用的属性介绍,如有所需,可查看文档看属性的详细说明。

按照如上所配置,我们预览下效果图

Yii2组件之多图上传插件FileInput的详细使用教程

Yii2组件之多图上传插件FileInput的详细使用教程

感觉上效果很是可以,在开始写php代码实现之前,我们先在controller中实现 initialPreview和 initialPreviewConfig的配置

假设上面的视图文件是用户展示商品图片的详情页,当前controller是指渲染视图文件的controller,则需要在controller中获取商品关联的图片,用于展示或者说用于商品图片的删除\新增操作。

// 假设商品的图片是 $relationBanners,$id是商品的id
// $relationBanners的数据结构如:
/**
* Array
*(
* [0] => Array
* (
* [id] => 1484314
* [goods_id] => 1173376
* [banner_url] => ./uploads/20160617/146612713857635322241f2.png
* )
*
*)
*/
$relationBanners = Banner::find()->where(['goods_id' => $id])->asArray()->all();
// 对商品banner图进行处理
$p1 = $p2 = [];
if ($relationBanners) {
foreach ($relationBanners as $k => $v) {
$p1[$k] = $v['banner_url'];
$p2[$k] = [
'url' => Url::toRoute('/banner/delete'),
'key' => $v['id'],
];
}
}
$model = new Banner;
return $this->render('banner', [
'model' => $model,
'p1' => $p1,
'p2' => $p2,
'id' => $id
]);

你可以看到p1是图片地址的集合,这里用于赋值给initialPreview

p2是一组url和key的集合,这里用于赋值给initialPreviewConfig

其中url是移除图片的请求地址

key是每个图片对应的id

此时我们视图文件中的pluginOptions应该是这样的

'pluginOptions' => [
// other code
'initialPreview' => $p1,
'initialPreviewConfig' => $p2,
// other code
],

注意设置initialPreviewAsData为true哦,不然等会创建图片后,预览图不会显示。

我们在一开始配置文件中配置了uploadUrl,该参数是异步上传的图片地址。

现在看上传界面应该是光秃秃的,我们选择一张图片后效果如上图2所示,

需要提醒的是,每张小图片上的上传是上传对应的小图片,input框(右下角)的上传和移除都是针对所有的图片的操作,一张也是上传,十张也是上传,我们这里只对多图上传的操作做一个必要的说明。

图片上传的地址以及上传需要的额外参数(如商品id)我们都准备好了,额外的参数配置项是uploadExtraData,具体见上面视图文件中的配置。

接着我们看 /goods/async-image 异步上传的程序实现

public function actionAsyncImage ()
{
// 商品ID
$id = Yii::$app->request->post('goods_id');
$p1 = $p2 = [];
if (empty($_FILES['Banner']['name']) || empty($_FILES['Banner']['name']['banner_url']) || !$id) {
echo '{}';
return;
}
for ($i = 0; $i < count($_FILES['Banner']['name']['banner_url']); $i++) {
$url = '/banner/delete';
$imageUrl = ''; //调用图片接口上传后返回图片地址
// 图片入库操作,此处不可以批量直接入库,因为后面我们还要把key返回 便于图片的删除
$model = new Banner;
$model->goods_id = $id;
$model->banner_url = $imageUrl;
$key = 0;
if ($model->save(false)) {
$key = $model->id;
}
// $pathinfo = pathinfo($imageUrl);
// $caption = $pathinfo['basename'];
// $size = $_FILES['Banner']['size']['banner_url'][$i];
$p1[$i] = $imageUrl;
$p2[$i] = ['url' => $url, 'key' => $key];
}
echo json_encode([
'initialPreview' => $p1, 
'initialPreviewConfig' => $p2, 
'append' => true,
]);
return;
}

到此,单图和多图上传的工作我们也就完成了。

为了实现图片的删除效果,这里可以先上传两张图片。你可以单张上传也可以多张上传。

上传成功后你可以刷新当前页面,因为一开始我们就在controller中实现了图片的预览工作,所以理应会展示我们已经上传的两张图片。

按照我们的配置,现在的预览图应该是这样的。

Yii2组件之多图上传插件FileInput的详细使用教程

不说废话,我们看图片删除的程序(/banner/delete)实现

public function actionDelete ()
{
if ($id = Yii::$app->request->post('key')) {
$model = $this->findModel($id);
$model->delete();
}
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return ['success' => true];
}

需要提醒的是,key就是我们配置 initialPreviewConfig项时指定的key,你可以参考controller中的key,也可以参考异步上传成功后p2的key.

到此,yii2中多图上传的组件使用以及程序代码我们都给出了具体的实现。

以上所述是小编给大家介绍的Yii2组件之多图上传插件FileInput的详细使用教程的全部叙述,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
Oct 03 PHP
PHP中使用cURL实现Get和Post请求的方法
Mar 13 PHP
解析php php_openssl.dll的作用
Jul 01 PHP
php实现mysql封装类示例
May 07 PHP
了解PHP的返回引用和局部静态变量
Jun 04 PHP
PHP 读取大文件并显示的简单实例(推荐)
Aug 12 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
Nov 04 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
form自动提交实例讲解
Jul 10 PHP
php字符串截取函数mb_substr用法实例分析
Jun 25 PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 PHP
php模拟post提交请求调用接口示例解析
Aug 07 PHP
PHP开发制作一个简单的活动日程表Calendar
Jun 20 #PHP
php中的登陆login实例代码
Jun 20 #PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
Jun 19 #PHP
php打乱数组二维数组多维数组的简单实例
Jun 17 #PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
Jun 17 #PHP
PHP 数组基本操作方法详解
Jun 17 #PHP
全面了解PHP中的全局变量
Jun 17 #PHP
You might like
php生成curl命令行的方法
2015/12/14 PHP
php简单截取字符串代码示例
2016/10/19 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
2008/12/02 Javascript
csdn 博客的css样式 v3
2009/02/24 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
JS之获取样式的简单实现方法(推荐)
2016/09/13 Javascript
JavaScript基本类型值-Undefined、Null、Boolean
2017/02/23 Javascript
JS使用cookie实现只出现一次的广告代码效果
2017/04/22 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
vue 清空input标签 中file的值操作
2020/07/21 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
[03:46]DOTA2英雄基础教程 维萨吉
2013/12/11 DOTA
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
python中异常捕获方法详解
2017/03/03 Python
python实现百度语音识别api
2018/04/10 Python
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
Django Rest framework三种分页方式详解
2019/07/26 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
优瑞自动咖啡机官网:Jura
2018/09/29 全球购物
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
AJAX都有哪些有点和缺点
2012/11/03 面试题
2014年个人工作总结报告
2014/11/27 职场文书
医院科室评语
2015/01/04 职场文书
银行实习推荐信
2015/03/27 职场文书
高中运动会前导词
2015/07/20 职场文书
演讲稿之开卷有益
2019/08/07 职场文书
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP