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();
}

作为旁注:您不应将此类图像存储在数据库中,这些图像不是为此而制作的,应使用一些文件系统,而只应将链接/路径存储在数据库中。作为旁注:您不应将此类图像存储在数据库中,这些图像不是为此而制作的,应该使用一些文件系统,并且数据库中只应存储链接/路径。非常感谢您的详细回答。我测试了它,它确实工作得很好。非常感谢您提供详细的答案。我测试了它,它确实工作得很好。