Unit testing 在单元测试中将图像保存到DB';在CakePHP 2中不能使用二进制类型
以下是夹具代码:Unit testing 在单元测试中将图像保存到DB';在CakePHP 2中不能使用二进制类型,unit-testing,cakephp,fixtures,cakephp-2.x,Unit Testing,Cakephp,Fixtures,Cakephp 2.x,以下是夹具代码: class UploadfileFixture extends CakeTestFixture { /** * Fields * * @var array */ public $fields = array( 'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'key' => 'primary'), 'dat
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
列中为BLOB
使用binary
类型,如中所指定
关于保存方法:
$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
type列将限于
L+2字节,其中L<216
也就是说,64k,你的151k远远超过了
默认情况下,CakePHPs装置仅支持二进制
,无论发生什么情况,它都将映射到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);
}
}
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();
}
我假设您使用的是MySQL,这意味着您的
BLOB
type列将限于
L+2字节,其中L<216
也就是说,64k,你的151k远远超过了
默认情况下,CakePHPs装置仅支持二进制
,无论发生什么情况,它都将映射到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);
}
}
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();
}
作为旁注:您不应将此类图像存储在数据库中,这些图像不是为此而制作的,应使用一些文件系统,而只应将链接/路径存储在数据库中。作为旁注:您不应将此类图像存储在数据库中,这些图像不是为此而制作的,应该使用一些文件系统,并且数据库中只应存储链接/路径。非常感谢您的详细回答。我测试了它,它确实工作得很好。非常感谢您提供详细的答案。我测试了它,它确实工作得很好。