Yii2文件上传
首先在app\controllers下建立TestController.php,内容为如下代码:
1 <?php 2 namespace app\controllers; 3 use Yii; 4 use yii\web\Controller; 5 use app\models\Upload; 6 use yii\web\UploadedFile; 7 8 class TestController extends Controller 9 { 10 public function actionUpload() 11 { 12 $model = new Upload(); 13 if (Yii::$app->request->isPost) { 14 $file = UploadedFile::getInstance($model, 'file'); 15 $path="uploads/".date("YmdH",time())."/"; 16 if ($file && $model->validate()) { 17 if (!file_exists($path)) { 18 mkdir($path,0777, true); 19 } 20 $file->saveAs($path . time() . '.' . $file->getExtension()); 21 Yii::$app->session->setFlash('success', '上传成功!'); 22 } 23 } 24 return $this->render('upload', ['model' => $model]); 25 } 26 }
需要注意的是,当app\web下面没有uploads文件夹时,需要建立,在上述代码中,建立的存储图片的文件夹为 "uploads/".date("YmdH",time())."/" ,因为存在层级目录,所以在使用mkdir()函数的时候,括号内的最后一个参数true必须要填,如果不填,则是代表建立的目录只有一个层级,如 "uploads/" ,这时就不能加上后面的以时间为下一层级的目录了。上述使用mkdir()函数建立的文件夹在app\web下。其中 Yii::$app->session->setFlash('success', '上传成功!'); 是当图片上传成功后,传递上传成功的提示在view里面显示。
app\models下建立Upload.php,代码如下:
1 <?php 2 namespace app\models; 3 use Yii; 4 use yii\base\Model; 5 6 class Upload extends Model{ 7 public $file; 8 public function rules(){ 9 return [ 10 [['file'], 'file', 'extensions' => 'jpg, png', 'mimeTypes' => 'image/jpeg, image/png',], 11 ]; 12 } 13 public function attributeLabels(){ 14 return [ 15 'file'=>'文件上传' 16 ]; 17 } 18 }
然后在views下建立test\upload.php,代码如下:
1 <?php 2 use yii\helpers\Html; 3 use yii\widgets\ActiveForm; 4 ?> 5 <!doctype html> 6 <html lang="en"> 7 <head> 8 <meta charset="UTF-8"> 9 <title>文件上传</title> 10 </head> 11 <body> 12 <?php if(Yii::$app->session->hasFlash('success')):?> 13 <div class="alert alert-danger"> 14 <?=Yii::$app->session->getFlash('success')?> 15 </div> 16 <?php endif ?> 17 <?php $form=ActiveForm::begin([ 18 'id'=>'upload', 19 'enableAjaxValidation' => false, 20 'options'=>['enctype'=>'multipart/form-data'] 21 ]); 22 ?> 23 <?= $form->field($model, 'file')->fileInput();?> 24 <?= Html::submitButton('提交', ['class'=>'btn btn-primary','name' =>'submit-button']) ?> 25 <?php ActiveForm::end(); ?> 26 27 </body> 28 </html>
其中
1 <?php if(Yii::$app->session->hasFlash('success')):?> 2 <div class="alert alert-danger"> 3 <?=Yii::$app->session->getFlash('success')?> 4 </div> 5 <?php endif ?>
就是当图片上传成功后,显示从Testcontroller中传过来的参数。