我似乎找不到这个问题的真正答案,所以我开始:
如何在PHP中解析multipart/form-data
格式的原始HTTP请求数据?我知道如果格式正确,原始POST可以自动解析,但我指的是来自PUT请求的数据,PHP不会自动解析它。数据是多部分的,看起来像这样:
------------------------------b2449e94a11c
Content-Disposition: form-data; name="user_id"
3
------------------------------b2449e94a11c
Content-Disposition: form-data; name="post_id"
5
------------------------------b2449e94a11c
Content-Disposition: form-data; name="image"; filename="/tmp/current_file"
Content-Type: application/octet-stream
�����JFIF���������... a bunch of binary data
我像这样用libcurl发送数据(伪代码):
curl_setopt_array(
CURLOPT_POSTFIELDS => array(
'user_id' => 3,
'post_id' => 5,
'image' => '@/tmp/current_file'),
CURLOPT_CUSTOMREQUEST => 'PUT'
);
如果我去掉了CURLOPT_CUSTOMREQUEST位,请求就会在服务器上作为POST处理,一切都会被很好地解析。
有没有办法手动调用PHPs、HTTP数据解析器或其他一些很好的方法来实现这一点?是的,我必须按PUT发送请求:)
发布于 2014-08-13 20:23:40
我使用了Chris的示例函数并添加了一些所需的功能,比如R Porter对$_FILES的数组的需求,希望能对一些人有所帮助。
<?php
include_once('class.stream.php');
$data = array();
new stream($data);
$_PUT = $data['post'];
$_FILES = $data['file'];
/* Handle moving the file(s) */
if (count($_FILES) > 0) {
foreach($_FILES as $key => $value) {
if (!is_uploaded_file($value['tmp_name'])) {
/* Use getimagesize() or fileinfo() to validate file prior to moving here */
rename($value['tmp_name'], '/path/to/uploads/'.$value['name']);
} else {
move_uploaded_file($value['tmp_name'], '/path/to/uploads/'.$value['name']);
}
}
}
发布于 2011-03-30 18:47:07
我怀疑最好的方法是“自己动手做”,尽管你可能会在使用类似(如果不是完全相同)格式的多部分电子邮件解析器中找到灵感。
从Content-Type HTTP头中获取边界,并使用它来分解请求的各个部分。如果请求非常大,请记住,您可能会将整个请求存储在内存中,甚至可能多次存储。
与之相关的RFC是RFC2388,幸运的是它非常短。
发布于 2015-03-16 05:00:48
我很惊讶没人提到parse_str
和mb_parse_str
$result = [];
$rawPost = file_get_contents('php://input');
mb_parse_str($rawPost, $result);
var_dump($result);
https://stackoverflow.com/questions/5483851
复制相似问题