如何将二进制文件直接保存到Yii中的数据库表字段(JSON数据)?

时间:2015-07-07 17:47:15

标签: forms file-upload yii yii-widgets

我正在使用包含表格的数据库处理Yii项目,其中几乎所有数据都作为JSON保存在字段中(它很疯狂,但它就是这样):

id      INTEGER
user_id INTEGER
data    LONGTEXT

这个" JSON字段" data具有以下结构,除其他外包含图像:

{
   "id":"1",
   "foo":"bar",
   ...
   "bat":{
      "baz":"buz",
      "name":"Joe Doe",
      "my_picture":"iVBORw0KGgoAAAANSUhEUgAAAGQA...", <-- binary
      ...
    }
}

显示它没有问题,但现在我想使数据可编辑。我的表格如下:

<?php
$form=$this->beginWidget('CActiveForm', array(
    'id' => 'insurance-form',
    'htmlOptions' => array('enctype' => 'multipart/form-data'),
    'enableAjaxValidation'=>false,
));
?>
<div class="row">
    <?php echo $form->labelEx($model, 'provider_name'); ?>
    <?php
    echo $form->textField($model, 'data[provider][name]', array(
        'size'=>60, 'maxlength'=>255, "autocomplete"=>"off"
    ));
    ?>
    <?php echo $form->error($model, 'data[provider][name]'); ?>
</div>

有效。

我知道,对于图片上传,我需要fileField(...),但无法找到,如何配置它以便将图像直接保存到数据库。怎么做他的?

1 个答案:

答案 0 :(得分:0)

查看

function initialize() {
    var mapOptions = {
        center: new google.maps.LatLng(-23, -46),
        zoom: 4,
        mapTypeId: google.maps.MapTypeId.HYBRID
    }
    var map = new google.maps.Map(document.getElementById("map"), mapOptions);
    var meukml = new google.maps.KmlLayer({
        url:'http://oceanos.nap.usp.br/remmarsp/tvlhico/contourfgradeSBB01.kmz'
    });
    meukml.setMap(map);        
}

google.maps.event.addDomListener(window, 'load', initialize);

<强>控制器

<div class="row">
    <?php echo $form->labelEx($model, 'provider_name'); ?>
    <?php
    echo $form->fileField($model, 'data[provider][name]', array());
    ?>
    <?php echo $form->error($model, 'data[provider][name]'); ?>
</div>

public function actionUpdate($id) { $model = $this->loadModel($id); if(isset($_POST['External'])) { $modelDataArray = $model->data; // adding the image as string to the POSted data if (isset($_FILES['MyModel']['name']['data']['provider']['picture'])) { $_POST['MyModel']['data']['provider']['picture'] = base64_encode( file_get_contents($_FILES['MyModel']['tmp_name']['data']['provider']['picture']) ); } $inputFieldData = $_POST['MyModel']['data']; $updatedDataArray = array_replace_recursive($modelDataArray, $inputFieldData); $model->attributes = $_POST['MyModel']; $updatedDataJson = json_encode($updatedDataArray); $model->setAttribute('data', $updatedDataJson); if($model->save()) { $this->redirect(array('view', 'id' => $model->id)); } } $this->render('update', array( 'model' => $model, )); } 模型

CActiveRecord