当前位置: 首页 > 知识库问答 >
问题:

ajax验证时,Yii2上载字段始终为空

米元凯
2023-03-14

我上传文件有问题。我使用kartik-v/yii2小部件文件输入扩展。这是我的代码:

表单模型规则

/**
 * @inheritdoc
 */
public function rules()
{
    return [
        [['image'], 'required', 'on' => static::SCENARIO_CREATE],
        [['image'], 'file', 'extensions' => 'png, jpg, jpeg', 'maxSize' => 1024 * 1024],
    ];
}

窗体视图

<?php $form = ActiveForm::begin([     
    'enableAjaxValidation' => true,
    'options' => ['enctype' => 'multipart/form-data']
]); ?>

 <?= $form->field($model, 'image')->widget(FileInput::classname(), [
            'options' => ['accept' => 'image/*'],
            'pluginOptions' => [
                'showPreview' => false,
                'showCaption' => true,
                'showRemove' => true,
                'showUpload' => false,
                'showCancel' => false
            ],            
        ]); ?>

控制器动作

 public function actionCreate()
{
    $model = new ItemForm();
    $model->scenario = ItemForm::SCENARIO_CREATE;

    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }

    if ($model->load(Yii::$app->request->post())) {

        $image = UploadedFile::getInstance($model, 'image');

        $randomString = Yii::$app->getSecurity()->generateRandomString(10);
        $name = Inflector::slug($model->title) . '_' . $randomString . '.' . $image->extension;

        $url = Image::URL . $name;

        $model->image = $name;          

        if ($model->save()) {
            $image->saveAs($url);
            return $this->redirect(['view', 'id' => $model->id]);
        }       
    } else {         
        return $this->render('create', [
            'model' => $model,             
        ]);
    }
}

当我提交表单时,总是出现错误“需要图像字段”。我已经阅读了很多教程,但在使用ajax验证时仍然存在同样的问题。有人能看看它,告诉我我做错了什么吗?

共有1个答案

易飞文
2023-03-14

编辑

最重要的是,如果表单中有文件类型字段,则不应使用enableAjaxValidation选项。请参阅此问题改用启用客户端验证

除了查看完整的模型外,您似乎正在尝试使用数据库表字段image作为上载图像的同一字段,而您不应该这样做,您应该在模型中声明一个自定义字段,并使用它上载文件,并将新文件名分配给数据库字段image目前,您必须在模型中添加一些内容并更改代码

1.在您的模型顶部的公共$标签之后声明一个名为$file的自定义字段,如下所示,Public$myFile;

2.更改验证规则

[['image'], 'file', 'extensions' => 'png, jpg, jpeg', 'maxSize' => 1024 * 1024],

以下

[['myFile'], 'file', 'extensions' => 'png, jpg, jpeg', 'maxSize' => 1024 * 1024],

[['image'], 'required', 'on' => static::SCENARIO_CREATE],

对此

[['myFile','image'], 'required', 'on' => static::SCENARIO_CREATE],

3.将html表单中的字段名从image更改为myFile,即$form-

4.有关操作uploadItemImage()函数内部的更改,请参见下文,我已对其进行了更新。

您正在将$name变量分配给$model-

 $model->image = $name; 

$name中它是一个字符串,而在模型中它应该是一个文件

 $name = Inflector::slug($model->title) . '_' . $randomString . '.' . $image->extension;

您应该做的是将上传文件的实例分配到model字段image,然后调用$model-

public function actionCreate()
{
    $model = new ItemForm();
    $model->scenario = ItemForm::SCENARIO_CREATE;

    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }

    if ($model->load(Yii::$app->request->post())) {

        $model->myFile = UploadedFile::getInstance($model, 'myFile');
        $randomString = Yii::$app->getSecurity()->generateRandomString(10);
        $model->image = Inflector::slug($model->title) . '_' . $randomString . '.' . $model->myFile->extension;

        $model->uploadItemImage();
        if ($model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        }       
    } else {         
        return $this->render('create', [
            'model' => $model,             
        ]);
    }
}

然后在模型中创建以下方法

public function uploadItemImage(){
    $url = Image::URL . $this->image;
    if(!$this->myFile->saveAs($url)){
       $this->addError('myFile','Unable to save the uploaded file');
    }
}

 类似资料:
  • 问题内容: 我尝试@Inject这样的字段(它是一个jar模块,在META-INF下存在空bean.xml): IDataProvider接口 数据提供者实现import javax.enterprise.context.ApplicationScoped; 我尝试注入DataProvider的类 如果我在Wildfly上运行此命令,则注入的dataProvider始终为null(DataCont

  • 我目前正在使用ASP开发一个网站。net MVC框架,我决定停止使用本地数据库,并在azure上发布我的web应用程序及其关联数据库。现在我有一个奇怪的身份验证问题。身份IsAuthenticated总是正确的。起初,我得到了以下错误: http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier或http://schem

  • 请注意,以下操作符合预期: 有人帮我吗?

  • 我正在尝试使用jQuery验证插件验证表单中的文件上载字段。我只需要检查文件是否已上载,而不需要检查文件是否具有特定的大小和/或类型。在最初提交时一切正常,问题是表单被提交到数据库,并允许以后编辑。编辑表单时,我设置了一个附加的隐藏字段,末尾附加了。因此,对于名为的字段,有一个名为的字段,其中将包含以前的提交数据。这样用户就不必每次都重新上传文件。因此,当字段为空时,我不知道如何编写一个方法来检查

  • 我试图在上传图片之前验证我的表单,但是我在中间件上得到了空字符串 下面是我的中间件: 我知道我可以使用multer的fileFilter,但是有些时候我没有任何图像可以上传,只有string来存储和验证,我尝试将req.body从multipart/form-data解析为string,然后验证并使用next(),但是我得到了一个范围错误,我该如何解决这个问题呢?

  • 问题内容: 我使用并且有以下内容; 验证说,但问题是该字段是 可选的 。因此,当用户将其留空时,也会显示相同的错误消息。 因此,我想做的是仅在字段不为空时验证。如果该字段为空,则跳过该字段的验证 问题答案: 我建议您不要使用,而是使用 主要原因是我们显示了要限制用户的一组值的消息,在此情况下,您的条件消息中显示了您不想限制的值。 因此,您想限制用户输入除空格和数字之外的其他任何内容,为此输入一个正