本文将介绍如何使用Yii2实现图片批量上传,包括文件的上传、图片的缩略图生成和文件的保存。通过本文的介绍,您将学会如何快速地实现Yii2图片批量上传的功能。
一、生成文件上传表单
首先,我们需要在Yii2中的视图文件中生成一个文件上传表单,代码如下:
<?php use yiihelpersHtml; use yiiwidgetsActiveForm; ?> <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?> <?= $form->field($model, 'imageFiles[]')->fileInput(['multiple' => true, 'accept' => 'image/*']) ?> <?= Html::submitButton('上传', ['class' => 'btn btn-primary']) ?> <?php ActiveForm::end() ?>
上述代码中,我们使用了Yii2的ActiveForm组件,为了支持文件上传,我们需要在form表单上添加'multipart/form-data'类型的属性。
此处使用了一个$name变量,在Yii2模型中,$name表示当前模型的属性名,方便数据传递。
二、接收上传文件
为了接收上传的文件,我们需要在控制器中增加一个action方法以处理上传的表单,代码如下:
public function actionUpload() { $model = new UploadForm(); if (Yii::$app->request->isPost) { $model->imageFiles = UploadedFile::getInstances($model, 'imageFiles'); if ($model->upload()) { return; } } return $this->render('upload', ['model' => $model]); }
代码中,我们首先实例化了UploadForm类,接收了上传的文件后调用该类中的upload()方法完成文件的保存和缩略图的生成。在此之前,必须先在UploadForm中定义UploadForm类:
<?php namespace appmodels; use Yii; use yiibaseModel; use yiiwebUploadedFile; class UploadForm extends Model { /** * @var UploadedFile[]|null */ public $imageFiles; public function rules() { return [ [['imageFiles'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg', 'maxFiles' => 4], ]; } public function upload() { if (!$this->validate()) { return false; } foreach ($this->imageFiles as $file) { $filename = md5($file->baseName . time()) . '.' . $file->extension; $file->saveAs('uploads/' . $filename); $thumb = Yii::$app->image->load('uploads/' . $filename); $thumb->resize(100, 100); $thumb->save('uploads/thumb/' . $filename); } return true; } } ?>
在代码中,我们使用了Yii2的上传文件组件,通过getInstances()方法获取上传的文件实例,并使用saveAs()方法将文件保存到指定的文件夹uploads/中。其中thumb/是缩略图文件夹,在保存原图时,同时使用开源图片处理库Yii2-image对图片进行了缩略图的生成。
三、渲染上传成功页
最后,我们需要在视图文件中呈现上传的结果。可以使用Yii2自带的GridView组件,代码如下:
<?php use yiigridGridView; use yiihelpersHtml; ?> <?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ ['class' => 'yiigridSerialColumn'], [ 'attribute' => 'name', 'label' => '文件名', 'format' => 'raw', 'value' => function ($model) { return Html::a(Html::encode($model->name), ['download', 'id' => $model->id]); }, ], 'type', 'size', 'created_at', ], ]) ?>
GridView组件展示了已上传的文件列表,并提供了下载的链接。
总结
在本文中,我们详细介绍了如何使用Yii2框架实现图片批量上传的功能,包括文件上传、图片的缩略图生成和文件的保存。该方法简单易用,方便开发。希望本文内容能够对你的开发工作有所帮助。