我遇到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 抱歉英语不好。