我正在编写一个RESTful API。我在使用不同的动词上载图像时遇到麻烦。
考虑:
我有一个对象,可以通过对URL的发布/放置/删除/获取请求来创建/修改/删除/查看。如果有要上载的文件,则请求是多部分形式;如果只有文本要处理,则请求是application / xml。
为了处理与对象相关的图像上传,我正在做类似的事情:
if(isset($_FILES['userfile'])) { $data = $this->image_model->upload_image(); if($data['error']){ $this->response(array('error' => $error['error'])); } $xml_data = (array)simplexml_load_string( urldecode($_POST['xml']) ); $object = (array)$xml_data['object']; } else { $object = $this->body('object'); }
这里的主要问题是在尝试处理放置请求时,显然$ _POST不包含放置数据(据我所知!)。
供参考,这是我构建请求的方式:
curl -F userfile=@./image.png -F xml="<xml><object>stuff to edit</object></xml>" http://example.com/object -X PUT
有谁知道如何xml在我的PUT请求中访问变量?
xml
首先,$_FILES在处理PUT请求时不填充。它仅在处理POST请求时由PHP填充。
$_FILES
您需要手动解析它。这也适用于“常规”字段:
// Fetch content and determine boundary $raw_data = file_get_contents('php://input'); $boundary = substr($raw_data, 0, strpos($raw_data, "\r\n")); // Fetch each part $parts = array_slice(explode($boundary, $raw_data), 1); $data = array(); foreach ($parts as $part) { // If this is the last part, break if ($part == "--\r\n") break; // Separate content from headers $part = ltrim($part, "\r\n"); list($raw_headers, $body) = explode("\r\n\r\n", $part, 2); // Parse the headers list $raw_headers = explode("\r\n", $raw_headers); $headers = array(); foreach ($raw_headers as $header) { list($name, $value) = explode(':', $header); $headers[strtolower($name)] = ltrim($value, ' '); } // Parse the Content-Disposition to get the field name, etc. if (isset($headers['content-disposition'])) { $filename = null; preg_match( '/^(.+); *name="([^"]+)"(; *filename="([^"]+)")?/', $headers['content-disposition'], $matches ); list(, $type, $name) = $matches; isset($matches[4]) and $filename = $matches[4]; // handle your fields here switch ($name) { // this is a file upload case 'userfile': file_put_contents($filename, $body); break; // default for all other files is to populate $data default: $data[$name] = substr($body, 0, strlen($body) - 2); break; } } }
在每次迭代时,$data将使用您的参数填充数组,并$headers使用每个部分的标头(例如:Content- Type等)填充数组,并$filename包含原始文件名(如果请求中提供了该文件名,并且适用于领域。
$data
$headers
Content- Type
$filename
请注意,以上multipart内容仅适用于内容类型。Content-Type在使用上述内容解析正文之前,请务必检查请求标头。
multipart
Content-Type