首页 > 编程知识 正文

Yii2 图片批量上传实现方法

时间:2023-11-19 17:44:54 阅读:289029 作者:HLGY

本文将介绍如何使用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框架实现图片批量上传的功能,包括文件上传、图片的缩略图生成和文件的保存。该方法简单易用,方便开发。希望本文内容能够对你的开发工作有所帮助。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。