首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用PHP手动解析原始的多部分/表单数据

用PHP手动解析原始的多部分/表单数据
EN

Stack Overflow用户
提问于 2011-03-30 16:28:59
回答 5查看 50.6K关注 0票数 37

我似乎找不到这个问题的真正答案,所以我开始:

如何在PHP中解析multipart/form-data格式的原始HTTP请求数据?我知道如果格式正确,原始POST可以自动解析,但我指的是来自PUT请求的数据,PHP不会自动解析它。数据是多部分的,看起来像这样:

代码语言:javascript
复制
------------------------------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发送数据(伪代码):

代码语言:javascript
复制
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发送请求:)

EN

回答 5

Stack Overflow用户

发布于 2014-08-13 20:23:40

我使用了Chris的示例函数并添加了一些所需的功能,比如R Porter对$_FILES的数组的需求,希望能对一些人有所帮助。

以下是class和示例usage

代码语言:javascript
复制
<?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']);
        }
    }
}
票数 6
EN

Stack Overflow用户

发布于 2011-03-30 18:47:07

我怀疑最好的方法是“自己动手做”,尽管你可能会在使用类似(如果不是完全相同)格式的多部分电子邮件解析器中找到灵感。

从Content-Type HTTP头中获取边界,并使用它来分解请求的各个部分。如果请求非常大,请记住,您可能会将整个请求存储在内存中,甚至可能多次存储。

与之相关的RFC是RFC2388,幸运的是它非常短。

票数 2
EN

Stack Overflow用户

发布于 2015-03-16 05:00:48

我很惊讶没人提到parse_strmb_parse_str

代码语言:javascript
复制
$result = [];
$rawPost = file_get_contents('php://input');
mb_parse_str($rawPost, $result);
var_dump($result);

http://php.net/manual/en/function.mb-parse-str.php

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5483851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档