本文描述笔者做的简单例子代码在yii利用其组建生成Yii 文件上传表单,实现文件上传,并对其中中文文件名进行编码处理,在具体显示部分用到CDetailView,并对其使用进一步深化,这里不太容易操作的是表单的建立,数据的获取,笔者的例子针对两个表,category表和product表,双方根据category_id进行联系,product包含字段为id,name,category_id,description,filename等,其中filename字段只是用来测试文件上传表单的处理,在实际过程中,可能会是图片名(图片上传),在添加product产品时添加产品名,选择分类,描述,上传图片(存放在’./assets/upload/’下,请注意Yii中路径的表示),创建成功将显示相关条目的信息,在文件名对应的地方,链接到相应位置,这里用到CHtml::link(),两个参数,第一个为显示数据,第二个显示的是链接地址。
1.表单文件(本例是_form.php,表单提交页面)
<?php $form=$this->beginWidget(‘CActiveForm’, array( ‘id’=>’product-form’, ‘htmlOptions’=>array(‘enctype’=>’multipart/form-data’), ‘enableAjaxValidation’=>false,)); ?>//指定文件上传表单,enctype属性一定是要设置的
<div> <?php echo $form->labelEx($model,’filename’); ?> <?php echo $form->FileField($model,’filename’); ?> <?php echo $form->error($model,’filename’); ?> </div>//显示浏览文件
2.控制器动作(action)
$model=new Product; if(isset($_POST['Product'])) { $model->attributes=$_POST['Product']; $file=CUploadedFile::getInstance($model,’filename’); //获取表单名为filename的上传信息 $filename=$file->getName(); //获取文件名 $filesize=$file->getSize(); //获取文件大小 $filetype=$file->getType(); //获取文件类型 $model->filename=$filename; //数据库中要存放文件名 $filename1=iconv(“utf-8″, “gb2312″, $filename);//这里是处理中文的问题,非中文不需要 $uploadfile=”./assets/upload/”.$filename1; $file->saveAs($uploadfile,true);//上传操作 if($model->save()) //执行保存,写入数据库 $this->redirect(array(‘view’,'id’=>$model->id)); } //数据存放成功,跳转到view页面$category=Category::model()->findAll(); //此处是为提交表单,传递分类信息 $this->render(‘create’,array( ‘model‘=>$model, ‘category’=>$category, )); }//交创建视图,并传递相应的信息,一是model,表单,二是category,分类信息
3.create.php(动作视图文件)
<?php echo $this->renderPartial(‘_form’, array(‘model’=>$model,‘category’=>$category)); ?>
4.view.php(页面显示)
<?php $this->widget(‘zii.widgets.CDetailView’, array( ‘data’=>$model, ‘attributes’=>array( ‘id’, ‘name’, ‘category_id’, ‘description’, array( ‘label’=>’filename’, ‘type’=>’raw’, ‘value’=>CHtml::link(CHtml::encode($model->filename), “./assets/upload/”.CHtml::encode($model->filename)), ) ),)); ?>