在网上搜了很多yii2图片上传插件,感觉这个和bootstrap融合的很好,比较能满足需求,故推荐给大家。
在使用过程中踩过不少坑,以下是具体使用说明。
本例所适用场景有一个商品表和一个商品图片表,商品图片表和商品表通过商品表ID对应。

开始前准备过程

$ php composer.phar require kartik-v/yii2-widget-fileinput "@dev"

or 在 composer.json 增加

"kartik-v/yii2-widget-fileinput": "@dev"

具体参考 https://github.com/kartik-v/yii2-widget-fileinput

配置图片上传路径

在 common/config/bootstrap.php 增加

Yii::setAlias('@uploadPath', dirname(dirname(__DIR__)) . '/upload');

创建 model文件 GoodsUploadForm.php

目录为 backend/models/form/

代码

<?php
/*** Created by PhpStorm.* User: Zhiqiang Guo* Date: 2017/8/1* Time: 10:39*/namespace backend\models\form;
use Yii;
use backend\models\GoodsPhoto;/*** 图片上传* Class GoodsUploadForm* @package backend\models\form*/
class GoodsUploadForm  extends GoodsPhoto
{public $imageFile;public function rules(){return [//数据验证这里可自己做[['imageFile'], 'file', 'skipOnEmpty' => true, 'extensions' => 'png,jpg,gif', 'maxFiles' => 4],];}/*** 上传** @author Zhiqiang Guo* @return void* @throws Exception* @access public*/public function upload(){if ($this->validate()) {$path = Yii::getAlias('@uploadPath')  . date("Ymd");if (!is_dir($path) || !is_writable($path)) {\yii\helpers\FileHelper::createDirectory($path, 0777, true);}//upload_no 上传图片的商品的唯一码,为了在商品ID产生之前插入图片表数据标识。$uploadNo = Yii::$app->request->post('upload_no', '');//针对修改商品图片$goodsId = Yii::$app->request->post('goods_id', '0');foreach ($this->imageFile as $file) {$filedetail = '/goods_' . md5(uniqid() . mt_rand(10000, 99999999)) . '.' . $file->extension;$filePath = $path . $filedetail;   if ($file->saveAs($filePath)) {                   //这里将上传成功后的图片信息保存到数据库$imageUrl = $this->parseImageUrl($filePath);$imageModel = new GoodsPhoto();$imageModel->img = $imageUrl;$imageModel->upload_no = $uploadNo;$imageModel->goods_id = $goodsId;$imageModel->save(false);$imageId = Yii::$app->db->getLastInsertID();}}//图片上传后返回值return ['uploadNo' => $uploadNo, 'imageUrl' => $imageUrl,'imageId'=>$imageId];}return false;}/*** 这里在upload中定义了上传目录根目录别名,以及图片域名* @author Zhiqiang Guo* @return void* @throws Exception* @access public*/private function parseImageUrl($filePath){if (strpos($filePath, Yii::getAlias('@uploadPath')) !== false) {return  str_replace(Yii::getAlias('@uploadPath'), '', $filePath);} else {return $filePath;}}}

视图view ,添加图片

参考如下

<div class="form-group"><label class="col-sm-3 control-label">图片上传</label><div class="col-lg-5"><?php$uploadNo = uniqid() . mt_rand(1, 100);echo Html::hiddenInput('uploadNo', $uploadNo);?><?= $form->field($model, 'img')->hiddenInput()->label(false); ?><?= $form->field($model, 'isad')->hiddenInput()->label(false); ?><?= $form->field($upload, 'imageFile[]')->label(false)->widget(\kartik\file\FileInput::className(), ['options' => ['multiple' => true],'pluginOptions' => [// 异步上传的接口地址设置'uploadUrl' => \yii\helpers\Url::to(['asyncphoto']),'uploadAsync' => true,// 异步上传需要携带的其他参数,比如商品id等,可选'uploadExtraData' => ['upload_no' => $uploadNo,],// 需要预览的文件格式'previewFileType' => 'image',//是否显示文件名'showCaption' => true,// 预览的文件'initialPreview' => isset($p1) ? $p1 : '',// 需要展示的图片设置,比如图片的宽度等'initialPreviewConfig' => isset($p2) ? $p2 : '',// 是否展示预览图'initialPreviewAsData' => true,// 最少上传的文件个数限制'minFileCount' => 1,// 最多上传的文件个数限制,需要配置`'multiple'=>true`才生效'maxFileCount' => 10,// 是否显示移除按钮,指input上面的移除按钮,非具体图片上的移除按钮'showRemove' => false,// 是否显示上传按钮,指input上面的上传按钮,非具体图片上的上传按钮'showUpload' => true,//是否显示[选择]按钮,指input上面的[选择]按钮,非具体图片上的上传按钮'showBrowse' => true,// 展示图片区域是否可点击选择多文件'browseOnZoneClick' => true,// 如果要设置具体图片上的移除、上传和展示按钮,需要设置该选项'fileActionSettings' => [// 设置具体图片的查看属性为false,默认为true'showZoom' => true,// 设置具体图片的上传属性为true,默认为true'showUpload' => false,// 设置具体图片的移除属性为true,默认为true'showRemove' => true,],],//网上很多地方都没详细说明回调触发事件,其实fileupload为上传成功后触发的,三个参数,主要是第二个,有formData,jqXHR以及response参数,上传成功后返回的ajax数据可以在response获取'pluginEvents' => ['fileuploaded' => "function (object,data){
//                    console.log(data.response.imageUrl);$('form #goods-img').val(data.response.imageUrl);$('form #goods-isad').val(data.response.imageId);}",//错误的冗余机制'error' => "function (){alert('图片上传失败');}"]]); ?></div></div>

视图view修改图片

参考如下

 <div class="form-group"><label class="col-sm-3 control-label">图片上传</label><div class="col-lg-5">                <?= $form->field($upload, 'imageFile[]')->label(false)->widget(\kartik\file\FileInput::className(), ['options' => ['multiple' => true],'pluginOptions' => [// 异步上传的接口地址设置'uploadUrl' => \yii\helpers\Url::to(['asyncphoto']),'uploadAsync' => true,// 异步上传需要携带的其他参数,比如商品id等,可选'uploadExtraData' => ['goods_id' => $model->goods_id,],// 需要预览的文件格式'previewFileType' => 'image',// 预览的文件'initialPreview' => isset($p1) ? $p1 : '',// 需要展示的图片设置,比如图片的宽度等'initialPreviewConfig' => isset($p2) ? $p2 : '',// 是否展示预览图'initialPreviewAsData' => true,//是否覆盖初始图片'overwriteInitial' => false,// 最少上传的文件个数限制'minFileCount' => 1,// 最多上传的文件个数限制,需要配置`'multiple'=>true`才生效'maxFileCount' => 10,// 是否显示移除按钮,指input上面的移除按钮,非具体图片上的移除按钮'showRemove' => false,// 是否显示上传按钮,指input上面的上传按钮,非具体图片上的上传按钮'showUpload' => true,//是否显示[选择]按钮,指input上面的[选择]按钮,非具体图片上的上传按钮'showBrowse' => true,// 展示图片区域是否可点击选择多文件'browseOnZoneClick' => true,// 如果要设置具体图片上的移除、上传和展示按钮,需要设置该选项'fileActionSettings' => [// 设置具体图片的查看属性为false,默认为true'showZoom' => true,// 设置具体图片的上传属性为true,默认为true'showUpload' => false,// 设置具体图片的移除属性为true,默认为true'showRemove' => true,],],//网上很多地方都没详细说明回调触发事件,其实fileupload为上传成功后触发的,三个参数,主要是第二个,有formData,jqXHR以及response参数,上传成功后返回的ajax数据可以在response获取'pluginEvents' => ['fileuploaded' => "function (object,data){
//                    console.log(data.response.imageUrl);$('form #goods-img').val(data.response.imageUrl);$('form #goods-isad').val(data.response.imageId);}",//错误的冗余机制'error' => "function (){alert('图片上传失败');}"]]); ?></div></div>

对应控制器方法异步处理上传图片

  /*** No explanation** @author Zhiqiang Guo* @return void* @throws Exception* @access public*/public function actionAsyncphoto(){$uploadForm = new GoodsUploadForm();if (Yii::$app->request->isPost) {$uploadForm->imageFile = UploadedFile::getInstances($uploadForm, 'imageFile');if ($imageArr = $uploadForm->upload()) {$p1 = $p2 = [];$p1[] = $imageArr['imageUrl'];$p2[] = ['url' => Url::toRoute('/goods/photodelete'), 'key' => $imageArr['imageId']];echo Json::encode(['uploadNo' => $imageArr['uploadNo'],'imageUrl' => $imageArr['imageUrl'],'imageId' => $imageArr['imageId'],'initialPreview' => $p1,'initialPreviewConfig' => $p2,'append' => true,
//                    'error'   => ''       //上传的error字段,如果没有错误就返回空字符串,否则返回错误信息,客户端会自动判定该字段来认定是否有错]);} else {echo Json::encode(['imageUrl' => '','error' => '文件上传失败']);}}}

控制器删除图片方法

    /*** 删除图片** @author Zhiqiang Guo* @return void* @throws Exception* @access public*/public function actionPhotodelete(){if ($id = Yii::$app->request->post('key')) {Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;$model = new GoodsPhoto();$data['goods_photo_id'] = $id;$res = $model->selwhere($data);if ($res[0]['is_ad'] == 1) {return ['error' => '宣传图不可删除!'];}if (!$model->deletes(['goods_photo_id' => $id])) {return ['success' => false];}}return ['success' => true];}

控制器添加商品方法

包含以下内容

                ['model' => $model,'upload' => new GoodsUploadForm(),]);

控制器修改商品

包含以下内容

            $goodsphotoArr = GoodsPhoto::find()->where(['goods_id' => $id])->asArray()->all();$p1 = $p2 = [];if ($goodsphotoArr) {foreach ($goodsphotoArr as $k => $v) {$p1[$k] = $v['img'];$p2[$k] = ['url' => Url::toRoute('/goods/photodelete'),'key' => $v['goods_photo_id'],];}}return $this->render('update', ['model' => $model,'upload' => new GoodsUploadForm(),'p1' => $p1,'p2' => $p2,]);

组件 FileInput的基本属性和设置

可参考
http://plugins.krajee.com/file-input#option-initialpreviewconfig

最终实现的效果如下

yii2 之图片上传插件fileinput使用说明相关推荐

  1. java 图片上传控件_Javashop 图片上传插件使用指南

    一.概述 Javashop 图片上传插件是一款基于WebUploader插件所封装的上传图片插件. 可用于快速生成上传图片页面,有如下特点: 基于freemarker指令模式所编写,只需一个指令,并且 ...

  2. think php上传图片,基于ThinkPHP5.0实现图片上传插件

    这篇文章主要介绍了关于基于ThinkPHP5.0实现图片上传插件,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 thinkphp5.0 图片上传插件可预览裁剪图片和保存原图片,执行裁剪 ...

  3. WebUploader文件图片上传插件的使用

    最近在项目中用到了百度的文件图片上传插件WebUploader.分享给大家 需要在http://fex.baidu.com/webuploader/download.html点击打开链接下载WebUp ...

  4. jquery.photoClip.js图片上传插件带拖动裁剪

    下载地址 jquery.photoClip.js是一款图片上传插件,可以拖动选择裁剪的区域. dd:

  5. php 上传图片控件,ThinkPHP5.0实现图片上传插件实例分享

    thinkphp5.0 图片上传插件可预览裁剪图片和保存原图片,执行裁剪图片后会删除 裁剪的原图片目录,以便减少空间.具体实现代码大家参考下本文,希望能帮助到大家. 效果预览图: 该插件主要功能是:可 ...

  6. php多图上传插件ios,yii2组件之多图上传插件FileInput的详细使用

    作者:白狼 出处:http://www.manks.top/yii2_multiply_images.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连 ...

  7. Bootstrap FileInput 图片上传插件

    最近找了一个比较好用的图片和文件上传插件,Bootstrap-file input插件功能如此强大,样式非常美观,并且支持上传文件预览,ajax同步或异步上传,无论是aspx.net 还是MVC.ne ...

  8. uniapp 图片上传插件使用说明

    插件地址:https://ext.dcloud.net.cn/plugin?id=4589 使用说明 本插件是一个云端上传插件,能够将本地的文件包括图片上传到云存储,ImageX是火山引擎推出的专业图 ...

  9. java多图片上传插件,Bootstrap中的fileinput 多图片上传及编辑功能

    Bootstrap中的fileinput 多图片上传及编辑功能 2019-01-01 编程之家收集整理的这篇文章主要介绍了Bootstrap中的fileinput 多图片上传及编辑功能,编程之家小编觉 ...

  10. bootstrap展示导入的图片_BootstrapFileInput 图片上传插件 详解

    插件描述:样式非常美观,并且支持上传文件预览,ajax同步或异步上传,拖曳文件上传等炫酷的功能,完全没有理由不去使用 file input插件功能如此强大,样式非常美观,并且支持上传文件预览,ajax ...

最新文章

  1. IBM人工智能将“掌舵”全球首个跨大西洋自主驾驶船舶
  2. php大商创 安装,大商创X2020最新纯净服务器安装教程
  3. 优雅地在 Mac上使用 IDE 查看open-jdk源码
  4. [GO] go使用etcd和watch方法进行实时的配置变更
  5. tensorflow2caffe(1) : caffemodel解析,caffemodel里面到底记录了什么?
  6. 04.search_template
  7. 迪普科技以近50%份额全面中标国家电网2016信息化硬件采购
  8. 业务id转密文短链的一种实现思路
  9. 索引和未索引执行计划的比较_详解Oracle复合索引+实例说明
  10. canal —— 阿里巴巴mysql数据库binlog的增量订阅消费组件
  11. 数组元素替换_Linux Shell 通俗简要的讲解数组操作
  12. mysql 查看数据库字段是否存在,mysql查询某张表是否存在某个字段和判断是否存在某个表名...
  13. FPGA 常用AXI总线介绍
  14. sidhu眼中的CoordinatorLayout.Behavior(一)
  15. 数据结构与算法 第一章 引入
  16. 单片机课程设计--电子密码锁(源代码+proteus仿真)
  17. RedHat7安装及小红帽硬盘分区建议
  18. apipost如何使用mock测试
  19. 电脑桌面计算机软件不见了,电脑桌面图标不见了怎么恢复?
  20. 10分钟内在windows下安装woocommerce开发测试环境

热门文章

  1. oracle crm系统叫什么,常用CRM软件有哪些?
  2. 转://Oracle 11gR2 硬件导致重新添加节点
  3. IOS平台开发实战培训
  4. 手撕:经典问题的遗传算法代码
  5. 重磅!2019上海落户政策大全!
  6. 广东:让“数据跑路”代替“民众跑腿”
  7. 六西格玛dfss_六西格玛设计(DFSS)的方法和知识
  8. python簇状柱形图_使用Matplotlib绘制堆积条形图
  9. Java动态读取map里面的key值
  10. activemq-messages-dequeud-but-not-consumed