我有一个原始表单数据,如下所示:
------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="intro"
O
------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="title"
T
------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="apiKey"
98d32fdsa
------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="method"
/media/add
------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="upload_field"; filename="original_filename.png"
Content-Type: image/png
------------V2ymHFg03ehbqgZCaKO6jy--
(代替upload_field的第二行,有这个文件的数据(此处不可见)。所以我的问题是:
如何解析上面的数据以获得表格:
$result['intro']
等内有数据?
答案 0 :(得分:1)
$boundary = "------------V2ymHFg03ehbqgZCaKO6jy"; // take this from content-type
$rawfields = explode($boundary,$data);
array_pop($rawfields); // drop the last -- piece
foreach ( $rawfields as $id=>$block )
{
list($mime,$content) = explode("\r\n\r\n",$block,2); // I think it's <cr><lf> by standards, maybe check!
if ( preg_match('/name="([^"]*)"/i',$mime,$match) )
{
$result[$match[1]] = $content;
// todo: do funky stuff with other fields
} else {
$result[] = $content; // just in case...
}
}
似的。
编辑:您还应该修剪每个内容块中的换行符,但rtrim
会删除多个换行符,因此您必须更有创意。
答案 1 :(得分:1)
整个文档的内容类型为multipart
,其中的部分由给定的边界分隔。
多部分文档中的每个部分或消息都采用标准消息格式:标题行,后跟空行,后跟表示该部分内容的字节序列。 HTTP和SMTP都是这样工作的。
对于Content-Disposition: form-data; name="title"
这样的标题行,您必须小心name
,因为它可以被编码(考虑如何表示任意值,例如包含双引号或者换行)。
答案 2 :(得分:0)
我自己正在处理类似的问题,并编写了自己的mvds代码版本,以便使用二进制文件。 Here's the thread以供将来参考。