本文實例講述了YII2框架實現表單中上傳單個文件的方法。分享給大家供大家參考,具體如下:
有些時候我們提交的表單中含有文件。怎么樣讓表單里的數據和文件一起提交。
我的數據表tb_user內容如下:
1
2
3
4
5
6
7
8
9
|
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來創建,這個就不解釋了):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?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> |
模型類代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
<?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; } } } |
控制器代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<?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框架的PHP程序設計有所幫助。
原文鏈接:https://www.cnblogs.com/jkko123/p/8662802.html