1、單個文件上傳
首先建立一個模型models/UploadForm.php,內容如下
namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
/**
* UploadForm is the model behind the upload form.
*/
class UploadForm extends Model
{
/**
* @var UploadedFile file attribute
*/
public $file;
/**
* @return array the validation rules.
*/
public function rules()
{
return [
[['file'], 'file'],
];
}
}
再建立一個視圖文件,內容如下
<?php use yii\widgets\ActiveForm; ?> <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?> <?= $form->field($model, 'file')->fileInput() ?> <button>Submit</button> <?php ActiveForm::end() ?>
最后建立控制器文件,內容如下
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->file = UploadedFile::getInstance($model, 'file');
if ($model->file && $model->validate()) {
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
}
}
return $this->render('upload', ['model' => $model]);
}
}
注意這里我們沒有用model->load(...),而是用了UploadedFile::getInstance(...)。區別是后者不會執行$model->validate(),所以需要手動的去執行$model->validate()來檢驗數據的合法性。如果檢驗通過了,上傳的文件保存在uploads文件夾下,即web目錄下的uploads里。
一些可選的配置選項
上傳文件不能為空
public function rules()
{
return [
[['file'], 'file', 'skipOnEmpty' => false],
];
}
上傳類型,不僅可以根據擴展名檢驗,還可以根據文件的內容進行檢驗
public function rules()
{
return [
[['file'], 'file', 'extensions' => 'jpg, png', 'mimeTypes' => 'image/jpeg, image/png',],
];
}
目錄生成:
/**
* 上傳圖片
* @return string
*/
private function uploadPic()
{
//是否上傳圖片
//upload
$file_img = '';
$file_name = md5(time());
$path = 'uploads/'.date("Y").'/'.date("m").'/'.date('d').'/';
if (!file_exists($path)) {
$this->createDir($path);
}
if (Yii::$app->request->isPost) {
$model = new WexinUploadForm();
$model->file = UploadedFile::getInstance($model, 'file');
if ($model->file && $model->validate()) {
$back = $model->file->saveAs($path .$file_name. '.' . $model->file->extension);
if($back)
$file_img = $path .$file_name. '.' . $model->file->extension;
}
}
return $file_img;
}
/**
* 遞歸:生成目錄
*/
private function createDir($str)
{
$arr = explode('/', $str);
if(!empty($arr))
{
$path = '';
foreach($arr as $k=>$v)
{
$path .= $v.'/';
if (!file_exists($path)) {
mkdir($path, 0777);
chmod($path, 0777);
}
}
}
}
