在一个请求中使用json的CakePHP REST API多部分文件

时间:2018-05-25 01:19:24

标签: php json cakephp

我遇到CakePHP请求处理问题... 我写了一个REST API来发布一些数据和文件,并在想要发送数据时使用multipart / form-data。 发送POST请求(Multipart / form-data并以json方式发送数据)时,需要将$ this-> request->数据从json字符串转换为Array: 我在下面编写了代码,将json数据转换为我控制器的beforeFilter中的Array:

$parser = function ($data) {

    return json_decode($this->request->data,true);
};

$this->RequestHandler->addInputType("file", array($parser));

这很好用,当我在控制器中获得$ this-> request->数据时,JSON数据成功转换为Array, 但是,如果我发送带文件的请求,则会发生以下错误:

传递给Hash :: insert()的参数1必须是类型数组,给定字符串,在第401行的/home/besepari/public_html/android/lib/Cake/Network/CakeRequest.php中调用并定义... < / p>

在对代码进行研究之后,我发现了问题,但我找不到解决问题的方法。我认为错误是因为$ json从json转换为数组(在beforeFilter中)发生在此事件之后所以json字符串传递给Hash :: insert()并使error.need成为在Hash :: insert()执行之前转换$ data的json字符串的方法。

最后我找到了解决这个问题的方法,但我的方法可能不是很好的解决方案。因为我改变了cakephp类的核心。 要修复该错误,请将cakeRequest.php _processFileData()方法替换为:

protected function _processFileData($path, $data, $field) {
    //Fix bug of hash::insert string given(because in json multipart,$this->data is string and made a bug)
    //check if string is json,parse it and save it to $this->data
    if(!is_array($this->data)){
        $parsedData=json_decode($this->data,true);

        if (json_last_error() === JSON_ERROR_NONE) {
            // JSON is valid
            $this->data=$parsedData;
        }
    }

    foreach ($data as $key => $fields) {
        $newPath = $key;
        if (strlen($path) > 0) {
            $newPath = $path . '.' . $key;
        }
        if (is_array($fields)) {
            $this->_processFileData($newPath, $fields, $field);
        } else {
            $newPath .= '.' . $field;
            $this->data = Hash::insert($this->data, $newPath, $fields);
        }
    }
}

谢谢, 我用的是cakephp 2 抱歉英语不好。

0 个答案:

没有答案