Yii2中的Rest API文件上传

3

我的控制器文件位于api/v1/controller/目录下。

class ProfileController extends ActiveController
  {
    public $modelClass = 'app\models\Profile';

    public function behaviors()
    {
        return [
            [
                'class' => 'yii\filters\ContentNegotiator',
                'only' => 
                         ['index', 'view', 'createnew','update','search'],
                'formats' => 
                         ['application/json' => Response::FORMAT_JSON,],

            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'index' => ['get'],            
                    'view' => ['get'],            
                    'createnew' => ['post'],       
                    'update' => ['put'],         
                    'delete' => ['delete'],        
                    'deleteall' => ['post'],
                    'search' => ['get']
                ],

            ]
        ];
    }

    public function actionCreatenew() {
        $model = new Profile();
        $model->load(Yii::$app->request->post());



        $model->asset = UploadedFile::getInstance($model, 'asset');
     
        $name = $model->user_id;

        if($model->asset) {
            
          $model->asset->saveAs('uploads/'.$name.'.
                           '.$model->asset->extension);
            $model->asset = $model->asset->name.'.'.
                            $model->asset->extension;
           
        }



        if($model->save()) {
            echo json_encode(array('status'=>"Success",
                     'data'=>$model->attributes),JSON_PRETTY_PRINT);
        } else {
            echo json_encode(array('status'=>"Failure",
                     'error_code'=>400,
                     'errors'=>$model->errors),JSON_PRETTY_PRINT);
        }
    }

}

当我尝试用Postman访问这个地址时:

POST http://localhost/myapp/api/v1/profiles

我收到了无效参数的错误信息:yii\base\InvalidParamException

返回内容不能是一个数组。

问题出在哪里?请求帮助,感谢!


我通过在我的api/config.php文件中添加以下内容来解决问题:''urlManager' => [ 'enablePrettyUrl' => true, 'enableStrictParsing' => true, 'showScriptName' => false, 'rules' => [ ['class' => 'yii\rest\UrlRule', 'controller' => ['v1/country','v1/profile'], 'extraPatterns' => [ 'POST createnew' => 'createnew', ], ], ], ],' - Jackhad
2个回答

10
您可以使用HTTP POST和form-data编码在Yii2中直接在您的Yii2控制器/操作中轻松接收单个/多个上传文件。

使用以下代码:

    $uploads = UploadedFile::getInstancesByName("upfile");
    if (empty($uploads)){
        return "Must upload at least 1 file in upfile form-data POST";
    }

    // $uploads now contains 1 or more UploadedFile instances
    $savedfiles = [];
    foreach ($uploads as $file){
        $path = //Generate your save file path here;
        $file->saveAs($path); //Your uploaded file is saved, you can process it further from here
    }

如果您使用Postman API客户端测试API的工作方式,您可以将上传端点配置为多文件上传的工作方式如下:

Body form-data params for POST data request

注意:方括号upfile[]很重要!Postman可以让您在一个插槽中选择多个文件上传,但这实际上不起作用。按照屏幕截图所示的方式创建文件数组,通过UploadedFile机制使Yii2操作可用。这大致相当于标准PHP $_FILES超全局变量,但更易于处理。
可以带有或不带有键名后面的方括号[]上传单个文件。当然,您可以根据自己的惯例将upfile命名为任何名称。

1

您应该使用\yii\web\UploadedFile::getInstanceByName('asset');而不是getInstance(),请查看链接


谢谢你提供的信息(如你所说)。但是我收到了“响应内容不应该是一个数组”的错误提示,我认为这不是因为这个问题。 - Jackhad
1
在哪一行?为什么要输出 JSON 字符串?你可以简单地使用 return ['status'=>'success','data'=>$model->attributes]; - mohit
我通过在我的api/config.php文件中添加以下内容来解决问题: ''urlManager' => [ 'enablePrettyUrl' => true, 'enableStrictParsing' => true, 'showScriptName' => false, 'rules' => [ ['class' => 'yii\rest\UrlRule', 'controller' => ['v1/country','v1/profile'], 'extraPatterns' => [ 'POST createnew' => 'createnew', ], ], ], ],' - Jackhad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接