CMultiFileUpload 用于上傳文件,支持一次同時上傳多個文件。這個 UI 組件是基于 jQuery Multi File Upload 插件。Yii 內(nèi)置的很多 UI 組件都是基于 JQuery,因此需要創(chuàng)建 assets 目錄用于存放動態(tài)生成的 javascripts 等。
所上傳的文件的信息可以通過$_FILES[widget-name]來訪問,比如,CMultiFileUpload 的 name 為”files” 所上傳的文件信息可以通過$_FILES[‘files’]來訪問。此外包含 CMultiFileUpload 的 Form 屬性需要設(shè)置 enctype=multipart/form-data。
本例創(chuàng)建一個 upload 目錄用于存放上傳的文件。我們通過配置文件設(shè)置中個上傳文件導(dǎo)入目錄。
修改/config/main.php 添加項(xiàng)目代碼
// application-level parameters that can be accessed
// using Yii::app()->params['paramName']
'params'=>require(dirname(__FILE__).'/params.php'),
為 Application 添加一些參數(shù),存放參數(shù)的文件為 config/param.php
定義上傳文件的目錄如下:
// this contains the application parameters that can be maintained via GUI
return array(
//upload directory
'uploadDir' => 'upload/',
);
在代碼中可以通過 Yii::app()->params[‘uploadDir’] 來訪問這個參數(shù),對于這個簡單的例子,你也可以直接使用 upload/ 做為固定的常量而無需定義 Application 的參數(shù) params.
本例不需使用 Model,我們定義 View 如下:
<div class="form">
<?php $form=$this->beginWidget('CActiveForm',array(
'method' =>'post',
'htmlOptions'=>array('enctype'=>'multipart/form-data'),
)); ?>
<?php $this->widget('CMultiFileUpload',array(
'name'=>'files',
'accept'=>'jpg|png',
'max'=>3,
'remove'=>'Remove',
//'denied'=>'', message that is displayed when a file type is not allowed
//'duplicate'=>'', message that is displayed when a file appears twice
'htmlOptions'=>array('size'=>25),
)); ?>
<div class="row submit">
<?php echo CHtml::submitButton('Upload'); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->
<ul>
<?php foreach($this->findFiles() as $filename): ?>
<li><?php echo CHtml::link($filename,
Yii::app()->baseUrl.'/'.Yii::app()->params['uploadDir'].$filename,
array('rel'=>'external'));?></li>
<?php endforeach; ?>
</ul>
使用 CMultiFileUpload 上傳擴(kuò)展名為 jpg|png 的文件,CMultiFileUpload 可以通過配置定義一些選項(xiàng),具體可以參考
修改其對應(yīng)的 Controller/Action。
class SiteController extends CController
{
/**
* Index action is the default action in a controller.
*/
public function actionIndex()
{
if(isset($_FILES['files']))
{
// delete old files
foreach($this->findFiles() as $filename)
unlink(Yii::app()->params['uploadDir'].$filename);
//upload new files
foreach($_FILES['files']['name'] as $key=>$filename)
move_uploaded_file($_FILES['files']['tmp_name'][$key],
Yii::app()->params['uploadDir'].$filename);
}
$this->render('index');
}
/**
* @return array filename
*/
public function findFiles()
{
return array_diff(scandir(Yii::app()->params['uploadDir']),
array('.', '..'));
}
}
Action 方法首先刪除 upload 目錄下的文件,然后將上傳的文件存放到該目錄下。
http://wiki.jikexueyuan.com/project/yii-development-tutorial/images/15.1.jpg" alt="picture15.1" />
本例下載