本文實例講述了YII2框架實現(xiàn)表單中上傳單個文件的方法。分享給大家供大家參考,具體如下:
有些時候我們提交的表單中含有文件。怎么樣讓表單里的數(shù)據(jù)和文件一起提交。
我的數(shù)據(jù)表tb_user內(nèi)容如下:
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來創(chuàng)建,這個就不解釋了):
?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/';
//返回你要操作的數(shù)據(jù)表名
public static function tableName()
{
return '{{%user}}';
}
//設(shè)置規(guī)則,驗證表單數(shù)據(jù)
public function rules()
{
return [
['name', 'required', 'message' => '請?zhí)顚懹脩裘?],
['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') . '/';
//判斷文件上傳路徑,如果不存在,則創(chuàng)建
if (!file_exists($filePath)) {
@mkdir($filePath, 0777, true);
@chmod($filePath, 0777);
}
//文件名,我們通過md5文件名加上擴(kuò)展名
$fileName = md5($head_img->baseName) . '.' . $head_img->extension;
$file = $filePath . $fileName;
//保存文件到我們的服務(wù)器上
$head_img->saveAs($file);
//返回服務(wù)器上的文件地址
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過來的數(shù)據(jù)加載到user對象
$data = YII::$app->request->post();
//注意第二個參數(shù)設(shè)為'',默認(rèn)YII的ActiveForm創(chuàng)建的表單元素會加上下標(biāo)
$user->load($data, '');
if ($user->validate()) {
$user->pwd = YII::$app->security->generatePasswordHash($user->pwd);
$user->head_img = $user->uploadHeadImg();
//這里保存時設(shè)為false不驗證,因為pwd加密了
$user->save(false);
} else {
var_dump($user->errors);
}
} else {
return $this->renderPartial('index');
}
}
}
這樣我們就可以通過表單上傳圖像了。
更多關(guān)于Yii相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結(jié)》、《php優(yōu)秀開發(fā)框架總結(jié)》、《smarty模板入門基礎(chǔ)教程》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家基于Yii框架的PHP程序設(shè)計有所幫助。
您可能感興趣的文章:- yii2.0框架使用 beforeAction 防非法登陸的方法分析
- Yii2使用$this->context獲取當(dāng)前的Module、Controller(控制器)、Action等
- Yii框架獲取當(dāng)前controlle和action對應(yīng)id的方法
- yii框架配置默認(rèn)controller和action示例
- YII2框架中驗證碼的簡單使用方法示例
- YII2框架中分頁組件的使用方法示例
- YII2框架中自定義用戶認(rèn)證模型,完成登陸和注冊操作示例
- YII2框架中操作數(shù)據(jù)庫的方式實例分析
- YII2框架自定義全局函數(shù)的實現(xiàn)方法小結(jié)
- yii2.0框架場景的簡單使用示例
- YII2框架中actions的作用與使用方法示例