引自免费微信小程序:皆我百晓生
看起来你在使用Yii2框架进行开发,并且遇到了一个关于验证规则的问题。在你的代码片段中,你定义了一个模型类(可能是某个模型的片段),其中包含了一些数据验证规则。这些规则用于确保输入的数据符合预期格式。具体到图片字段,你将其设置为字符串类型,但实际运行时却收到了错误提示,说图片不是字符串。
根据提供的信息,这可能是因为在尝试保存数据时,传入的图片并非以字符串形式存在,而是其他类型,比如文件对象、二进制流或者是URL等。在Yii2框架中,如果你想要上传并存储图片,通常会涉及到文件上传组件yii\web\UploadedFile,它在前端通过表单提交后,在服务器端会自动转换成一个UploadedFile实例。
解决这个问题的方法是确保在处理图片上传时,正确地将图片转换为字符串。这里有一个基本的步骤和示例代码:
- 在前端HTML表单中,你需要添加一个
enctype="multipart/form-data"属性,以便允许文件上传。 - 在控制器的相应动作方法里,接收上传的图片。例如,如果你的模型名为
Horse,那么在控制器中可能会有类似这样的代码:
public function actionCreate()
{
$model = new Horse();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
// 如果上传成功,执行其他逻辑...
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
- 确保在模型中定义了相应的属性和验证规则。你的代码片段中似乎缺少了对图片字段的定义,所以你需要添加一个字段,例如
$pictrue,并在验证规则中指定其为字符串:
namespace app\models;
use yii\db\ActiveRecord;
use yii\helpers\FileHelper;
use Imagine\Image\Box;
class Horse extends ActiveRecord
{
public $pictrue;
public function rules()
{
return [
// ... 其他规则 ...
[['pictrue'], 'file', 'extensions' => ['jpg', 'jpeg', 'png'], 'mimeTypes' => ['image/jpeg', 'image/png'], 'checkExtensionByMimeType' => true],
[['pictrue'], 'string'],
// ... 其他规则 ...
];
}
// ... 其他方法 ...
public function attributeLabels()
{
return [
// ... 其他属性标签 ...
'pictrue' => '图片',
// ... 其他属性标签 ...
];
}
}
- 在视图文件(例如
views/horse/create.php)中,创建一个用于选择图片的输入元素:
= $form->field($model, 'pictrue')->fileInput() ?>
= Html::submitButton('创建', ['class' => 'btn btn-primary']) ?>
- 当用户提交表单后,
$model->pictrue将会是一个UploadedFile实例。为了将其转换为字符串(通常是图片的base64编码),你需要在保存模型之前做这个操作:
if ($model->load(Yii::$app->request->post())) {
$model->pictrue = base64_encode(file_get_contents($model->pictrue->tempName));
if ($model->save()) {
// ... 执行其他逻辑 ...
}
}
这样,即使图片是以文件的形式传递过来的,也会被正确地转换为字符串存储。注意,这种方式可能会增加数据库的大小,因为图片会被以base64编码存储,而不是以原始二进制形式。如果数据库大小是个问题,你可能需要考虑将图片文件存储在服务器的文件系统上,并在数据库中只存储文件路径或URL。
这是一个基础的例子,实际项目中你可能还需要处理更多细节,比如文件上传的目录、权限管理、错误处理以及是否需要对图片进行压缩或裁剪等。

