不少新人對上傳這種操做有些懼怕、摸不着頭腦,今天阿北帶你學習一邊yii2 UploadFile類,看看yii2如何幫你輕鬆的完成上傳操做。php
老樣子,先來個目錄html
初步熟悉UploadedFile類web
從Model開始的上傳數據庫
沒有Model的上傳數組
UploadedFile類位於 vendor/yiisoft/yii2/web/UploadedFile.php服務器
它提供了好比 getInstance、getInstances、getInstanceByName、saveAs等諸多方法
詳情能夠參考速查表 http://nai8.me/tool-sc.html#s...yii2
咱們先來設計一個簡單的會員表,實現對其頭像的上傳功能。app
而後咱們新建一個action並寫下以下代碼。yii
// @app/FileController.php public function actionIndex(){ $model = User::findOne(1); if(Yii::$app->request->isPost){ $file = UploadedFile::getInstance($model,'avatar'); var_dump($file); } return $this->render('index',[ 'model'=>$model ]); // 視圖裏代碼 <?= $form->field($model,'avatar')->fileInput();?> }
其實UploadedFile只是對上傳文件信息的再次封裝並提供一組用於操做該文件的方法,就像上面代碼同樣,咱們將對UploadedFile獲取的上傳對象進行打印,看看它究竟是什麼?ide
在這裏咱們使用yii2-debug來觀察這一切。
而經過UploadedFile::getInstance接收後造成的對象 $file 以下圖
在這裏你看到了,對於UploadedFile對象,它的屬性和上傳文件的信息一致,咱們暫時認爲 $file = 上傳文件 + 一些方法,而且它能夠像正常Model接收數據同樣獲取上傳的文件。
既然咱們已經獲得了文件,它就在$file,那麼如今咱們將它保存到指定的目錄就行了。
這要用到 UploadedFile 提供的saveAs方法,固然在這裏你也能夠用 getExtension 獲取文件擴展名等等。
可是要注意,此刻咱們操做的是一個具體的對象,saveAs是保存這個文件、getExtension是得到此文件的擴展名,這些都是對象方法,不是靜態方法,初學者自行體會。
// 繼續編寫actionIndex ... if(Yii::$app->request->isPost){ $file = UploadedFile::getInstance($model,'avatar'); $path = 'data/'.time().".".$file->getExtension(); if($file->saveAs(Yii::getAlias("@webroot").'/'.$path) === true){ $model->avatar = $path; } $model->update(); } ...
要注意的是,saveAs的參數是一個服務器物理路徑。
執行後,我數據庫中已經有了該頭像的相對路徑。
固然這是最簡單的,你也能夠經過Model的rules 或 action本身的邏輯實現對文件的驗證,好比擴展名、好比大小、好比等等。
這一切貌似很輕鬆就完成了,咱們再也不用去處理蹩腳的原生PHP上傳文件,可是有幾種特殊狀況還須要說下。
好比個人user增長了一列identity_card,表明身份證,我如今要用來存放身份證的正反面圖片
按照上面的需求,視圖確定是要變更下,將identity_card變爲一個數組
<?= $form->field($model,'identity_card[]')->fileInput();?> <?= $form->field($model,'identity_card[]')->fileInput();?>
而後咱們使用 UploadedFile::getInstances來完成,核心代碼以下
... if(Yii::$app->request->isPost){ $files = UploadedFile::getInstances($model,'identity_card'); // 不是identity_card[] var_dump($files); } ...
getInstances能幫咱們接收一個數組類型的fileInput,看看結果
而後咱們能夠對這個$files結果集進行遍歷等操做,據具體場景而定便可。
上面都是經過一個模型來接收客戶傳遞過來的文件,它很方便,咱們接下來介紹下jie'sho不經過Model如何去處理一個文件或一組文件上傳接收問題。
在這裏我不計劃寫任何代碼,給你們一個圖,也許明白的夠透徹。
話說其實 getInstanceByName、getInstancesByName纔是UploadedFile真正核心的函數,getInstance和getInstances最後也是調用了它們。
如今你會了麼?接收一個或一組文件。
該函數能獲取上傳文件的原始名,須要注意的是返回的名字不包含擴展名。
該函數能夠獲取上傳文件的擴展名,好比一個文件爲a.png,則該函數返回的是png而不是image/png,另外擴展名均處理爲小寫了已經。
另外若是咱們也能夠直接調用一些變量
type 返回好比image/png這樣的媒體類型
size 返回文件的大小
name 文件原始名(含擴展名)
tempName 系統存放文件的臨時名
以上就是UploadedFile的全部用法和一些變量,但願對你有用。
更多yii2技術乾貨 歡迎來到個人小站 http://nai8.me