0
点赞
收藏
分享

微信扫一扫

YII学习第十八天,文件上传相关

Gascognya 2022-08-05 阅读 19


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));  设置图片大小 



(二)展示及下载 
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;
}

 

举报

相关推荐

0 条评论