亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

ディレクトリ 検索
閱讀前篇 簡介 Yii 是什么 從 Yii 1.1 升級 入門 安裝 Yii 運(yùn)行應(yīng)用 第一次問候 使用Forms 數(shù)據(jù)庫應(yīng)用 使用 Gii 生成代碼 進(jìn)階 應(yīng)用結(jié)構(gòu) 概述 入口腳本 應(yīng)用(Applications) 應(yīng)用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴(kuò)展(Extensions) 請求處理 運(yùn)行概述 啟動引導(dǎo)(Bootstrapping) 路由和創(chuàng)建URL 請求(Requests) 響應(yīng)(Responses) Sessions 和 Cookies 錯(cuò)誤處理(Handling Errors) 日志(Logging) 關(guān)鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動加載(Autoloading) 服務(wù)定位器(Service Locator) 依賴注入容器(Dependency Injection Container) 配合數(shù)據(jù)庫工作 數(shù)據(jù)庫訪問 (Data Access Objects) 查詢生成器(Query Builder) 活動記錄(Active Record) 數(shù)據(jù)庫遷移(Migrations) Sphinx Redis MongoDB Elasticsearch 接收用戶數(shù)據(jù) 創(chuàng)建表單(Creating Forms) 輸入驗(yàn)證(Validating Input) 文件上傳(Uploading Files) 收集列表輸入(Collecting Tabular Input) 多模型的復(fù)合表單(Getting Data for Multiple Models) 顯示數(shù)據(jù) 格式化輸出數(shù)據(jù)(Data Formatting) 分頁(Pagination) 排序(Sorting) 數(shù)據(jù)提供器(Data Providers) 數(shù)據(jù)小部件(Data Widgets) 客戶端腳本使用(Working with Client Scripts) 主題(Theming) 安全 認(rèn)證(Authentication) 授權(quán)(Authorization) 處理密碼(Working with Passwords) 客戶端認(rèn)證(Auth Clients) 最佳安全實(shí)踐(Best Practices) 緩存 概述 數(shù)據(jù)緩存 片段緩存 頁面緩存 HTTP 緩存 RESTfull Web服務(wù) 快速入門(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(yīng)(Response Formatting) 授權(quán)認(rèn)證(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 錯(cuò)誤處理(Error Handling) 開發(fā)工具 調(diào)試工具欄和調(diào)試器 使用Gii生成代碼 生成API文檔 測試 概述(Overview) 配置測試環(huán)境(Testing environment setup) 單元測試(Unit Tests) 功能測試(Function Tests) 驗(yàn)收測試(Acceptance Tests) 測試夾具(Fixtures) 高級專題 高級應(yīng)用模板 創(chuàng)建自定義應(yīng)用程序結(jié)構(gòu) 控制臺命令 核心驗(yàn)證器(Core Validators) 國際化 收發(fā)郵件 性能優(yōu)化 共享主機(jī)環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
テキスト

文件上傳

文件上傳

在Yii里上傳文件通常使用yii\web\UploadedFile類, 它把每個(gè)上傳的文件封裝成?UploadedFile?對象。 結(jié)合yii\widgets\ActiveForm和models,你可以輕松實(shí)現(xiàn)安全的上傳文件機(jī)制。

創(chuàng)建模型

和普通的文本輸入框類似,當(dāng)要上傳一個(gè)文件時(shí),你需要?jiǎng)?chuàng)建一個(gè)模型類并且用其中的某個(gè)屬性來接收上傳的文件實(shí)例。 你還需要聲明一條驗(yàn)證規(guī)則以驗(yàn)證上傳的文件。 舉例來講,

namespace app\models;

use yii\base\Model;
use yii\web\UploadedFile;

class UploadForm extends Model{
    
    public $imageFile;

    public function rules()
    {
        return [
            [['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'],
        ];
    }
    
    public function upload()
    {
        if ($this->validate()) {
            $this->imageFile->saveAs('uploads/' . $this->imageFile->baseName . '.' . $this->imageFile->extension);
            return true;
        } else {
            return false;
        }
    }
}

在以上代碼里,imageFile?屬性用于接收上傳的文件實(shí)例。它對應(yīng)一條file?驗(yàn)證規(guī)則, 該規(guī)則使用 yii\validators\FileValidator 來確保只上傳擴(kuò)展名為?png?或?jpg?的文件。?upload()?方法會執(zhí)行該驗(yàn)證并且把上傳的文件保存在服務(wù)器上。

通過?file?驗(yàn)證器,你可以檢查文件的擴(kuò)展名,大小,MIME類型等等。詳情請查閱?Core Validatators?章節(jié)。

>提示: 如果你要上傳的是一張圖片,可以考慮使用image驗(yàn)證器。?image?驗(yàn)證器是通過yii\validators\ImageValidator實(shí)現(xiàn)驗(yàn)證的,確保對應(yīng)的模型屬性 收到的文件是有效的圖片文件,然后才保存,或者使用擴(kuò)展類Imagine Extension進(jìn)行處理.

渲染文件輸入

接下來,在視圖里創(chuàng)建一個(gè)文件輸入控件

<?phpuse yii\widgets\ActiveForm;
?>

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>

    <?= $form->field($model, 'imageFile')->fileInput() ?>

    <button>Submit</button>

<?php ActiveForm::end() ?>

需要注意的是要記得在表單選項(xiàng)里加入?enctype?屬性以確保文件能被正常上傳。?fileInput()?方法會渲染一個(gè)?<input type="file">標(biāo)簽,讓用戶可以選擇一個(gè)文件上傳。

視圖和模型的連接

現(xiàn)在,在控制器方法里編寫連接模型和視圖的代碼以實(shí)現(xiàn)文件上傳。

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;

class SiteController extends Controller{
    public function actionUpload()
    {
        $model = new UploadForm();

        if (Yii::$app->request->isPost) {
            $model->imageFile = UploadedFile::getInstance($model, 'imageFile');
            if ($model->upload()) {
                // 文件上傳成功
                return;
            }
        }

        return $this->render('upload', ['model' => $model]);
    }
}

在上面的代碼里,當(dāng)提交表單的時(shí)候,yii\web\UploadedFile::getInstance()方法就被調(diào)用, 上傳的文件用一個(gè)?UploadedFile?實(shí)例表示。然后,我們依靠模型的驗(yàn)證規(guī)則確保上傳的文件是有效的, 并將文件保存在服務(wù)器上。

上傳多個(gè)文件

將前面所述的代碼做一些調(diào)整,也可以一次性上傳多個(gè)文件。

首先你得調(diào)整模型類,在?file?驗(yàn)證規(guī)則里增加一個(gè)?maxFiles?選項(xiàng),用以限制一次上傳文件的最大數(shù)量。?upload()方法也得修改, 以便一個(gè)一個(gè)地保存上傳的文件。

namespace app\models;

use yii\base\Model;
use yii\web\UploadedFile;

class UploadForm extends Model{
    
    public $imageFiles;

    public function rules()
    {
        return [
            [['imageFiles'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg', 'maxFiles' => 4],
        ];
    }
    
    public function upload()
    {
        if ($this->validate()) { 
            foreach ($this->imageFiles as $file) {
                $file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
            }
            return true;
        } else {
            return false;
        }
    }
}

在視圖文件里,你需要把?multiple?選項(xiàng)添加到fileInput()函數(shù)調(diào)用里, 這樣文件輸入控件就可以接收多個(gè)文件。

<?phpuse yii\widgets\ActiveForm;
?>

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>

    <?= $form->field($model, 'imageFiles[]')->fileInput(['multiple' => true, 'accept' => 'image
? ? public?$filename;

? ?
? ? public?$key;

? ?
? ? protected?$fileObject;?//?SplFileObject?is?very?convenient?for?seeking?to?particular?line?in?a?file


? ?
? ? public?function?init()
? ?
{
? ? ? ? parent::init();

? ? ? ? //?open?file
? ? ? ? $this->fileObject?=?new?SplFileObject($this->filename);
? ? }

? ?
? ? protected?function?prepareModels()
? ?
{
? ? ? ? $models?=?[];
? ? ? ? $pagination?=?$this->getPagination();

? ? ? ? if?($pagination?===?false)?{
? ? ? ? ? ? //?in?case?there's?no?pagination,?read?all?lines
? ? ? ? ? ? while?(!$this->fileObject->eof())?{
? ? ? ? ? ? ? ? $models[]?=?$this->fileObject->fgetcsv();
? ? ? ? ? ? ? ? $this->fileObject->next();
? ? ? ? ? ? }
? ? ? ? }?else?{
? ? ? ? ? ? //?in?case?there's?pagination,?read?only?a?single?page
? ? ? ? ? ? $pagination->totalCount?=?$this->getTotalCount();
? ? ? ? ? ? $this->fileObject->seek($pagination->getOffset());
? ? ? ? ? ? $limit?=?$pagination->getLimit();

? ? ? ? ? ? for?($count?=?0;?$count?<?$limit;?++$count)?{
? ? ? ? ? ? ? ? $models[]?=?$this->fileObject->fgetcsv();
? ? ? ? ? ? ? ? $this->fileObject->next();
? ? ? ? ? ? }
? ? ? ? }

? ? ? ? return?$models;
? ? }

? ?
? ? protected?function?prepareKeys($models)
? ?
{
? ? ? ? if?($this->key?!==?null)?{
? ? ? ? ? ? $keys?=?[];

? ? ? ? ? ? foreach?($models?as?$model)?{
? ? ? ? ? ? ? ? if?(is_string($this->key))?{
? ? ? ? ? ? ? ? ? ? $keys[]?=?$model[$this->key];
? ? ? ? ? ? ? ? }?else?{
? ? ? ? ? ? ? ? ? ? $keys[]?=?call_user_func($this->key,?$model);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }

? ? ? ? ? ? return?$keys;
? ? ? ? }?else?{
? ? ? ? ? ? return?array_keys($models);
? ? ? ? }
? ? }

? ?
? ? protected?function?prepareTotalCount()
? ?
{
? ? ? ? $count?=?0;

? ? ? ? while?(!$this->fileObject->eof())?{
? ? ? ? ? ? $this->fileObject->next();
? ? ? ? ? ? ++$count;
? ? ? ? }

? ? ? ? return?$count;
? ? }
}
前の記事: 次の記事: