Yii2在API中将图像发布到模型,而不使用Yii2命名约定

Yii2在API中将图像发布到模型,而不使用Yii2命名约定,yii2,Yii2,我正在为移动应用程序创建一个端点,以便将图像发送到服务器。我正在发布带有chrome邮递员分机的图像。图像位于$\u文件变量中,名为image。如何将此图像加载到模型或UploadedFile类中?$model->load(Yii::$app->request->post())行未正确加载文件,因为它不在Yii2的表单命名约定中 它目前正在返回: { "success": false, "message": "Required parameter 'image' is not s

我正在为移动应用程序创建一个端点,以便将图像发送到服务器。我正在发布带有chrome邮递员分机的图像。图像位于
$\u文件
变量中,名为
image
。如何将此图像加载到模型或
UploadedFile
类中?
$model->load(Yii::$app->request->post())
行未正确加载文件,因为它不在Yii2的表单命名约定中

它目前正在返回:

{
    "success": false,
    "message": "Required parameter 'image' is not set."
}
代码

models\Image.php


您的问题似乎是用于发送图像文件的名称。通常,Yii2使用表单属性的名称,如“ModelName[attributeName]”,您发送的图像文件名为“image”

有两种方法可以解决此问题:

  • 更改用于发送图像文件的名称,以遵循相同的命名约定。然而,你似乎不想这样
  • 使用
    getInstanceByName('image')
    方法,而不是
    getInstance($model,'image')
  • 问题来了 当您通过api发送文件时,它们不会异步发送。如果你查一下

    echo '<pre>';
     print_r($_FILES); //returns nothing 
     print_r($_POST["image"]);  //returns something
     echo '</pre>';
    die;
    
    然后在ajax帖子上


    我希望这有帮助

    您在第2点中提供的功能正是我想要的。非常感谢。
    <?php
    namespace api\modules\v1\controllers;
    
    use api\modules\v1\models\Image;
    use yii\web\Controller;
    use yii\web\UploadedFile;
    use Yii;
    
    class DefaultController extends Controller
    {
        public $enableCsrfValidation = false;
    
        public function actionIndex()
        {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    
            $model = new Image();
    
            if (Yii::$app->request->isPost) {
                if($model->load(Yii::$app->request->post()))
                {
                    $model->image = UploadedFile::getInstance($model, 'image');
                    if ($model->upload()) {
                        // file is uploaded successfully
                        return ['success' => true, 'message' => 'File saved.'];
                    }
                    else return ['success' => false, 'message' => 'Could not save file.'];
                }
                else return ['success' => false, 'message' => 'Required parameter \'image\' is not set.'];
            }
            else return ['success' => false, 'message' => 'Not a POST request.'];
        }
    }
    
    echo '<pre>';
     print_r($_FILES); //returns nothing 
     print_r($_POST["image"]);  //returns something
     echo '</pre>';
    die;
    
    The form
     <?php $form = ActiveForm::begin(['options' => ['enctype' => 
      'multipart/form-data','id'=>'slider_form']]); ?>  //dont forget enctype
    
     <?= $form->field($model, 'file')->fileInput() ?>
    
     var formData = new FormData($('form#slider_form')[0].files);
    
    $.post(
        href, //serialize Yii2 form 
        {other atributes ,formData:formData}
    )
    
    Then on the controller simply access via
    $model->file =$_FILES["TblSlider"]; //here this depends on your form attributes check with var_dump($_FILES)
    $file_tmp = $_FILES["TblSlider"]["tmp_name"]["file"];
            $file_ext = pathinfo($_FILES['TblSlider']['name']["file"], PATHINFO_EXTENSION);
    
            if(!empty($model->file)){
    
                $filename = strtotime(date("Y-m-d h:m:s")).".".$file_ext;
    
                move_uploaded_file($file_tmp, "../uploads/siteimages/slider/".$filename);
                ///move_uploaded_file($file_tmp, Yii::getAlias("@uploads/siteimages/slider/").$filename);
                $model->image = $filename;
            }