在单元测试中将图像保存到数据库不适用于 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();
}
夹具代码如下:
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();
}