1. 程式人生 > 程式設計 >YII2框架實現表單中上傳單個檔案的方法示例

YII2框架實現表單中上傳單個檔案的方法示例

本文例項講述了YII2框架實現表單中上傳單個檔案的方法。分享給大家供大家參考,具體如下:

有些時候我們提交的表單中含有檔案。怎麼樣讓表單裡的資料和檔案一起提交。

我的資料表tb_user內容如下:

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來建立,這個就不解釋了):

<?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>

模型類程式碼如下:

<?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;
    }
  }
}

控制器程式碼如下:

<?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');
    }
  }
}

這樣我們就可以通過表單上傳影象了。

YII2框架實現表單中上傳單個檔案的方法示例

YII2框架實現表單中上傳單個檔案的方法示例

更多關於Yii相關內容感興趣的讀者可檢視本站專題:《Yii框架入門及常用技巧總結》、《php優秀開發框架總結》、《smarty模板入門基礎教程》、《php面向物件程式設計入門教程》、《php字串(string)用法總結》、《php+mysql資料庫操作入門教程》及《php常見資料庫操作技巧彙總》

希望本文所述對大家基於Yii框架的PHP程式設計有所幫助。