yii框架提供了activeFileField控件来完成上传文件(当然也包括了上传图片)的操作
1、函数原型:
public static string activeFileField(CModel $model, string $attribute, array $htmlOptions=array ());
2、调用例子:
(1)首先,设置form,这一步一 定要做,把form设置为’multipart/form-data’,具体请看我的:
<?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'user-form', 'enableAjaxValidation'=>false, 'htmlOptions'=>array('enctype'=>'multipart/form-data'), )); ?>
注:id的作用。
(2) 接着,在view下的form里设置:
<div class="row"> <?php echo $form->labelEx($model,'avatar'); ?> <?php echo CHtml::activeFileField($model,'avatar'); ?> <?php echo $form->error($model,'avatar'); ?> </div>
最后,加上提交按钮,
<div class="row buttons"> <?php echo CHtml::submitButton($model->isNewRecord ? '立即创建' : '保存修改'); ?> </div> <?php $this->endWidget(); ?>
(3) 如果你想预览图片,那么请注意了,可以加上这么一段:
<div class="row"> <?php echo '图片预览'; ?> <?php echo '<img src="http://localhost/../'.$model->avatar.'" style="width:200px; height:300px;" />'; ?> </div>
(4)最后,需要在控制类里加上下面的:
$image = CUploadedFile::getInstance($model, 'avatar'); if( is_object($image) && get_class($image) === 'CUploadedFile' ){ $model->avatar = '自己设置的文件名'.'.jpg'; }else{ $model->avatar = 'NoPic.jpg'; } if( $model->save() ){ if(is_object($image) && get_class($image) === 'CUploadedFile'){ $image->saveAs(Yii::app()->basePath.'/../uploads/'.$model->avatar); } $this->redirect(array('view','id'=>$model->userId)); }
注:问了方便文件管理,建议这样使用 $image->saveAs(‘./assets/upload/’.$imageName) ,保证assets目录下存在upload目录
版本二:
public function beforeSave() { if($file=CUploadedFile::getInstance($this,'uploadedFile')) { $this->file_name=$file->name; $this->file_type=$file->type; $this->file_size=$file->size; $this->file_content=file_get_contents($file->tempName); } return parent::beforeSave(); }
(5)限制上传的文件必须是图片,还有限制图片大小,那么请到model层里的rules新增这么一句:
array('avatar', 'file', 'allowEmpty'=>true, 'types'=>'jpg,gif,png', 'maxSize'=>1024 * 1024 * 1, 'tooLarge'=>'头像最大不超过1MB,请重新上传!', ),
(6) 显示图片时,在view目录中,使用CHtm::image()函数
CHtml::image($model->product_imgage,//保存图片的名称,只要文件名正确 ,yii默认帮你查找图片
‘产品图片’, alt属性,放在页面显示的该名称
array(‘width’=>250,’height’=>120)); 设置图片大小
注:参考 http://www.9ihl.com/archives/312
(二)展示及下载
1,展示
<? echo CHtml::link(my_link_name,array('displaySavedImage','id'=>$model->primaryKey)); ?>
2,下载
public function actionDisplaySavedImage() { $model=$this->loadModel($_GET['id']); header('Pragma: public'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Content-Transfer-Encoding: binary'); header('Content-length: '.$model->file_size); header('Content-Type: '.$model->file_type); header('Content-Disposition: attachment; filename='.$model->file_name); echo $model->file_content; }