yii2的上傳只需這一篇技術文就足夠了

不少新人對上傳這種操做有些懼怕、摸不着頭腦,今天阿北帶你學習一邊yii2 UploadFile類,看看yii2如何幫你輕鬆的完成上傳操做。php

老樣子,先來個目錄html

  • 初步熟悉UploadedFile類web

  • 從Model開始的上傳數據庫

  • 沒有Model的上傳數組

UploadedFile類

UploadedFile類位於 vendor/yiisoft/yii2/web/UploadedFile.php服務器

它提供了好比 getInstancegetInstancesgetInstanceByNamesaveAs等諸多方法
詳情能夠參考速查表 http://nai8.me/tool-sc.html#s...yii2

從Model開始的上傳

咱們先來設計一個簡單的會員表,實現對其頭像的上傳功能。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結果集進行遍歷等操做,據具體場景而定便可。

沒有Model的上傳

上面都是經過一個模型來接收客戶傳遞過來的文件,它很方便,咱們接下來介紹下jie'sho不經過Model如何去處理一個文件或一組文件上傳接收問題。

在這裏我不計劃寫任何代碼,給你們一個圖,也許明白的夠透徹。

圖片描述

話說其實 getInstanceByNamegetInstancesByName纔是UploadedFile真正核心的函數,getInstance和getInstances最後也是調用了它們。

如今你會了麼?接收一個或一組文件。

還有些小細節

getBaseName()

該函數能獲取上傳文件的原始名,須要注意的是返回的名字不包含擴展名。

getExtension()

該函數能夠獲取上傳文件的擴展名,好比一個文件爲a.png,則該函數返回的是png而不是image/png,另外擴展名均處理爲小寫了已經。

幾個變量

另外若是咱們也能夠直接調用一些變量

  • type 返回好比image/png這樣的媒體類型

  • size 返回文件的大小

  • name 文件原始名(含擴展名)

  • tempName 系統存放文件的臨時名

以上就是UploadedFile的全部用法和一些變量,但願對你有用。

更多yii2技術乾貨 歡迎來到個人小站 http://nai8.me

相關文章
相關標籤/搜索