首页 > 后端开发 > php教程 > 如何在 PHP 中手动解析原始多部分/表单数据数据?

如何在 PHP 中手动解析原始多部分/表单数据数据?

DDD
发布: 2024-11-02 18:39:03
原创
247 人浏览过

How to Manually Parse Raw Multipart/Form-Data Data in PHP?

在 PHP 中手动解析原始 Multipart/Form-Data 数据

处理来自 Multipart/form-data 格式的 HTTP PUT 请求的数据时, PHP 不会自动解析原始数据。因此,开发人员在从此类请求中提取信息时可能会遇到挑战。

解决方案:

  1. 读取原始请求数据:

    • 使用 file_get_contents('php://input') 读取原始数据。
  2. 从内容类型标头中提取边界:

    • 使用正则表达式捕获边界值来自 Content-Type 标头($_SERVER['CONTENT_TYPE']).
  3. 按边界分割数据:

    • 将原始数据分割为使用 preg_split("- $boundary")。
  4. 将块分成单独的字段:

    • 对于每个块:

      • 上传的文件:

        • 查找包含 application/octet-stream 的块并提取字段名称和filename.
      • 其他字段:

        • 使用正则提取字段名称和值

示例代码:

<code class="php">function parse_raw_http_request(array &$a_data)
{
  $input = file_get_contents('php://input');
  preg_match('/boundary=(.*)$/', $_SERVER['CONTENT_TYPE'], $matches);
  $boundary = $matches[1];

  $a_blocks = preg_split("/-+$boundary/", $input);
  array_pop($a_blocks);

  foreach ($a_blocks as $id => $block)
  {
    if (empty($block))
      continue;

    if (strpos($block, 'application/octet-stream') !== FALSE)
    {
      preg_match('/name=\&quot;([^\&quot;]*)\&quot;.*stream[\n|\r]+([^\n\r].*)?$/s', $block, $matches);
    }
    else
    {
      preg_match('/name=\&quot;([^\&quot;]*)\&quot;[\n|\r]+([^\n\r].*)?\r$/s', $block, $matches);
    }
    $a_data[$matches[1]] = $matches[2];
  }
}</code>
登录后复制

用法:

<code class="php">$a_data = array();
parse_raw_http_request($a_data);
var_dump($a_data);</code>
登录后复制

以上是如何在 PHP 中手动解析原始多部分/表单数据数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板