前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >YII2框架实现表单中上传单个文件的方法示例

YII2框架实现表单中上传单个文件的方法示例

作者头像
砸漏
发布2020-11-02 10:10:38
7180
发布2020-11-02 10:10:38
举报
文章被收录于专栏:恩蓝脚本

本文实例讲述了YII2框架实现表单中上传单个文件的方法。分享给大家供大家参考,具体如下:

有些时候我们提交的表单中含有文件。怎么样让表单里的数据和文件一起提交。

我的数据表tb_user内容如下:

代码语言:javascript
复制
CREATE TABLE `tb_user` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
 `name` varchar(32) DEFAULT '' COMMENT '用户名',
 `pwd` varchar(64) DEFAULT '' COMMENT '密码',
 `head_img` varchar(256) DEFAULT '' COMMENT '图像',
 `sex` tinyint(1) DEFAULT '0' COMMENT '性别(0:男,1:女)',
 `age` tinyint(3) DEFAULT '0' COMMENT '年龄',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

表单页面代码如下(至于为什么没有用ActiveForm来创建,这个就不解释了):

代码语言:javascript
复制
<?php
use yii\helpers\Url;
? 
<!doctype html 
<html lang="zh-CN" 
<head 
  <meta charset="UTF-8" 
  <title 表单提交</title 
</head 
<body 
<form action="<?php echo Url::toRoute('index/index'); ? " method="post" enctype="multipart/form-data" 
  姓名:<input type="text" name="name" <br 
  密码:<input type="password" name="pwd" <br 
  性别:<input type="radio" name="sex" value="0" checked 男
     <input type="radio" name="sex" value="1" 女<br 
  年龄:<input type="number" name="age" <br 
  头像:<input type="file" name="head_img" <br 
  <input type="submit" value="提交" 
  <input name="_csrf" type="hidden" value="<?php echo \Yii::$app- request- csrfToken; ? " 
</form 
</body 
</html 

模型类代码如下:

代码语言:javascript
复制
<?php

namespace app\models;

use yii\db\ActiveRecord;
use yii\web\UploadedFile;

class MyUser extends ActiveRecord
{
  //注意这里的上传路径是相对你入口文件
  const UPLOAD_PAHT = 'uploads/';

  //返回你要操作的数据表名
  public static function tableName()
  {
    return '{{%user}}';
  }

  //设置规则,验证表单数据
  public function rules()
  {
    return [
      ['name', 'required', 'message' =  '请填写用户名'],
      ['pwd', 'string', 'length' =  [6, 12], 'message' =  '密码6-12位'],
      ['sex', 'in', 'range' =  [0, 1], 'message' =  '正确选择性别'],
      ['age', 'integer', 'min' =  1, 'max' =  120, 'message' =  '正确填写年龄'],
      ['head_img', 'image', 'extensions' =  ['png', 'jpg', 'gif'], 'maxSize' =  1024 * 1024 * 1024, 'message' =  '请上传头像'],
    ];
  }

  //上传头像
  public function uploadHeadImg()
  {
    //'head_img'这个字符串必须跟你表单中file控件的name字段相同
    $head_img = UploadedFile::getInstanceByName('head_img');
    if (!empty($head_img)) {
      $filePath = self::UPLOAD_PAHT . date('Ymd') . '/';
      //判断文件上传路径,如果不存在,则创建
      if (!file_exists($filePath)) {
        @mkdir($filePath, 0777, true);
        @chmod($filePath, 0777);
      }
      //文件名,我们通过md5文件名加上扩展名
      $fileName = md5($head_img- baseName) . '.' . $head_img- extension;
      $file = $filePath . $fileName;
      //保存文件到我们的服务器上
      $head_img- saveAs($file);
      //返回服务器上的文件地址
      return $file;
    } else {
      return false;
    }
  }
}

控制器代码如下:

代码语言:javascript
复制
<?php

namespace app\controllers;

use YII;
use yii\web\Controller;

class IndexController extends Controller
{
  public function actionIndex()
  {
    if (YII::$app- request- isPost) {
      $user = new \app\models\MyUser();

      //把POST过来的数据加载到user对象
      $data = YII::$app- request- post();
      //注意第二个参数设为'',默认YII的ActiveForm创建的表单元素会加上下标
      $user- load($data, '');

      if ($user- validate()) {
        $user- pwd = YII::$app- security- generatePasswordHash($user- pwd);
        $user- head_img = $user- uploadHeadImg();

        //这里保存时设为false不验证,因为pwd加密了
        $user- save(false);
      } else {
        var_dump($user- errors);
      }
    } else {
      return $this- renderPartial('index');
    }
  }
}

这样我们就可以通过表单上传图像了。

更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档