我有一个示例Restler类:
class Author {
....
function post($request_data=NULL) {
var_dump($request_data);
var_dump($_FILES);
var_dump($_REQUEST);
return $this->dp->insert($this->_validate($request_data));
}
....
}
我正在尝试通过简单的HTML表单将文件和一些数据发布到Restler服务:
<FORM action="http://host/index.php/author" enctype="application/x-www-form-urlencoded" method="post">
Name: <INPUT type="text" name="name" value="dima"><BR>
Email: <INPUT type="text" name="email" value="dima@prot.lt"><BR>
File: <INPUT type="file" name="files"><BR>
<INPUT type="submit" value="Send"> <INPUT type="reset">
</FORM>
很明显,$_FILES
数组将为空,但$_REQUEST
和$request_data
将包含三个变量:
name = "dima"
,email = "dima@prot.lt"
和file = "selected file name"
。
在下一个测试中,我将表单的enctype值更改为multipart / form-data。
<FORM action="http://host/index.php/author" enctype="multipart/form-data" method="post">
Name: <INPUT type="text" name="name" value="dima"><BR>
Email: <INPUT type="text" name="email" value="dima@proto.lt"><BR>
File: <INPUT type="file" name="files"><BR>
<INPUT type="submit" value="Send"> <INPUT type="reset">
</FORM>
当我按提交表单时,在$_REQUEST
数组中,我会看到相同的三个变量,$_FILES
数组将填充上传的文件信息,但是 $request_data
数组将为空 !!
在这种情况下,有人可以提供帮助吗?我在哪里弄错了?
答案 0 :(得分:1)
我已经解决了这个问题,通过编写Restler插件,可能会遇到其他同样的问题:
<?php
/**
* URL Encoded String in multipart data format
* @category Framework
* @author Dmitrij Orlov <dmitrij.orlov@gmail.com>
*/
class UrlMultipartFormat implements iFormat
{
const REQUEST_MIME = 'multipart/form-data';
const RESPONCE_MIME = 'application/json';
const EXTENSION = 'post';
public function getMIMEMap() {
return array(self::EXTENSION=>self::REQUEST_MIME);
}
public function getMIME(){
return self::RESPONCE_MIME;
}
public function getExtension(){
return self::EXTENSION;
}
public function setMIME($mime){
//do nothing
}
public function setExtension($extension){
//do nothing
}
public function encode($data, $human_readable=FALSE){
return $human_readable ?
$this->json_format(json_encode(object_to_array($data))) :
json_encode(object_to_array($data));
}
public function decode($data){
return $_REQUEST;
}
public function __toString(){
return $this->getExtension();
}
/**
* Pretty print JSON string
* @param string $json
* @return string formated json
*/
private function json_format($json)
{
$tab = " ";
$new_json = "";
$indent_level = 0;
$in_string = FALSE;
$len = strlen($json);
for($c = 0; $c < $len; $c++) {
$char = $json[$c];
switch($char) {
case '{':
case '[':
if(!$in_string) {
$new_json .= $char . "\n" .
str_repeat($tab, $indent_level+1);
$indent_level++;
} else {
$new_json .= $char;
}
break;
case '}':
case ']':
if(!$in_string) {
$indent_level--;
$new_json .= "\n".str_repeat($tab, $indent_level).$char;
} else {
$new_json .= $char;
}
break;
case ',':
if(!$in_string) {
$new_json .= ",\n" . str_repeat($tab, $indent_level);
} else {
$new_json .= $char;
}
break;
case ':':
if(!$in_string) {
$new_json .= ": ";
} else {
$new_json .= $char;
}
break;
case '"':
if($c==0){
$in_string = TRUE;
}elseif($c > 0 && $json[$c-1] != '\\') {
$in_string = !$in_string;
}
default:
$new_json .= $char;
break;
}
}
return $new_json;
}
}
?>
答案 1 :(得分:0)
Restler v2.1及更低版本不支持multipart/form-data
,因为我们专注于API创建。但我们对创意持开放态度,并会考虑将其添加到未来的版本中。
在您的函数中直接使用$_REQUEST
和$_FILES
并没有错,目前这是获取数据的唯一选项