unchanged
Title
Saving files to a blob field in the database
As a follow-up from the [How to upload a file using a
model](http://www.yiiframework.com/wiki/2/how-to-upload-a-file-using-a-model/
"How to upload a file using a model") wiki entry that explains how to
save a file to the filesystem, this article will do the same using a blob field
in the database.
### Edit the model:
The first step is to change the model in order to self manage the file:
~~~
[php]
class Candidate extends CActiveRecord
{
/**
* Property for receiving the file from the form
* It should be different from any other field in the database
*/
public $uploadedFile;
public function rules()
{
return array(
array('uploadedFile', 'file', 'types'=>'jpg, gif, png'),
);
}
/**
* Saves the name, size, type and data of the uploaded file
*/
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();
}
}
~~~
Do not forget to give a rule for this attribute as it has to be safe. Is also a
good practice to delete any rule referring to the other 4 fields (file_name,
file_type, file_size, file_content), as they are not supposed to be modified by
massively assigned inputs.
### Edit the view:
In the view we can put:
~~~
[php]
<div class="row">
<?php echo $form->labelEx($model,'uploadedFile'); ?>
<?php echo $form->fileField($model,'uploadedFile'); ?>
<?php echo $form->error($model,'uploadedFile'); ?>
</div>
~~~
### Displaying images:
To showIn the imageview we can
write an action:put the code:
~~~
[php]
'value'=>CHtml::link(my_link_name,array('displaySavedImage','id'=>$model->primaryKey)),
~~~
So it generates link like
http://myserver/yii/myapp/index.php?r=candidate/displaySavedImage&id=1
Where Candidate is current model.
To show saved image we can write an action in Controller:
~~~
[php]
/**
* DisplaysOpens the preview ofdialog in
browser to open/save the photo.image.
*/
public function actionDisplay()actionDisplaySavedImage()
{
$model=$this->loadModel(); $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->cv_file_size);
header('Content-Type: '.$model->file_type);
echo $model->file_content;'.$model->cv_file_type);
header('Content-Disposition: attachment; filename='.$model->cv);
echo $model->cv_file_content;
}
~~~
Note *$_GET\['id'\]* as passed argument of loadModel function.