在单元测试中将图像保存到数据库不适用于 CakePHP 2 中的二进制类型

Save image to DB in unit test doesn't work with type binary in CakePHP 2

夹具代码如下:

class UploadfileFixture extends CakeTestFixture {

/**
 * Fields
 *
 * @var array
 */
    public $fields = array(
        'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'key' => 'primary'),
        'data' => array('type' => 'binary', 'null' => false, 'default' => null),
        'path' => array('type' => 'string', 'null' => false, 'default' => null, 'collate' => 'utf8_general_ci',
'charset' => 'utf8'),
...

如您所见,我在 data 列中使用 binary 键入 BLOB,如 documentation 中指定的那样。

关于保存方法:

 $file['data'] = @file_get_contents($uri);
 ...
 $model_file->save($file);

我在尝试保存 151K 图像时收到此消息:

PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'data' at row 1

我假设您使用的是 MySQL,这意味着您的 BLOB 类型列将被限制为

L + 2 bytes, where L < 216

http://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#idm140456796731584

即 64k,你的 151k 远远超过了。

默认情况下,CakePHPs fixtures 仅支持 binary,无论如何都会映射到 blob。但是,您可以添加自定义列定义,或通过 Mysql::$columns 属性 修改现有列定义。例如,您可以这样做

使用扩展数据源

app/Model/Datasource/Database/AppMysql.php

<?php
App::uses('Mysql', 'Model/Datasource/Database');

class AppMysql extends Mysql
{
    public function __construct($config, $autoConnect)
    {
        $this->columns['mediumbinary'] = array('name' => 'mediumblob');
        parent::__construct($config, $autoConnect);
    }
}

app/Config/database.php

public $test = array(
    'datasource' => 'Database/AppMysql',
    // ...
);

你的灯具

public $fields = array(
    // ...
    'data' => array('type' => 'mediumbinary', 'null' => false, 'default' => null),
    // ...
);

或者通过动态修改数据源

例如在那个特定的夹具中,比如

public function init()
{
    $source = ConnectionManager::getDataSource($this->useDbConfig);
    $source->columns['mediumbinary'] = array('name' => 'mediumblob');

    parent::init();
}