【问题标题】:How to get "php://input" data if I'm using Content-Type multipart/form-data如果我使用 Content-Type multipart/form-data,如何获取“php://input”数据
【发布时间】:2016-08-30 22:20:52
【问题描述】:

还有其他选择吗?

我正在使用Advanced Rest Client 来测试我正在开发的 API。

我使用 POST 发送 JSON。 在代码中,$_FILES 可以,但 file_get_contents("php://input") 为空。

如果我不发送任何文件,那么我可以使用file_get_contents("php://input")

PHP 版本:5.6.4

【问题讨论】:

    标签: php json post


    【解决方案1】:

    正如 GhostGambler 所说,php://input 不适用于 enctype="multipart/form-data"。

    您不应将 JSON 作为文件附加到您的请求中,而应将其作为请求正文添加到 post 请求中,并设置 Content-Type 标头 (application/json)。然后它将在php://input 中提供。

    【讨论】:

    • 我附加的不是 JSON 文件,而是图像。我发送的 JSON 在请求正文中
    • 那么这就是你的问题.. 一旦你使用enctype="multipart/form-data"php://input 将保持为空。您应该划分功能(即 REST 和所有),而不是将二进制发布数据与 json 内容相结合。好吧,基本上你有几个选择.. 1. 将图像发布到 API > 返回 ID,发布带有所需 ID 的 json(元数据?)。 2. 将文件编码为base64(更大尺寸)并发布到json文件中,解码并存储。不过,我更喜欢选项 1,更干净一些。
    【解决方案2】:

    好的,所以我最终为我的 JSON 数据命名,例如 0=[{"q":"w"}],然后使用 $_POST['0'] 获取它。还有$_FILES的文件

    这是它在高级 REST 客户端中的外观:

    【讨论】:

      【解决方案3】:

      访问任何 POST/FILES 超全局变量最有可能消耗 php://input

      在任何情况下,如果您发送 JSON 有效负载,您也不能拥有 multipart-formdata 有效负载,因此 $_FILES 应该为空。如果您需要在同一页面上处理两者(IMO 的坏主意),请确保在访问 $_FILESphp://input 之前检查请求正文之外的内容类型标头或其他一些信息

      【讨论】:

        【解决方案4】:

        php://input 是一个只读流,允许您读取原始数据 从请求正文。在 POST 请求的情况下,最好 使用php://input 而不是$HTTP_RAW_POST_DATA,因为它没有 依赖于特殊的 php.ini 指令。此外,对于那些情况 $HTTP_RAW_POST_DATA 默认不填充,它可能是 激活时内存占用较少的替代方案 always_populate_raw_post_dataphp://input 不适用于 enctype="multipart/form-data".

        http://php.net/manual/de/wrappers.php.php

        由于 HTTP_RAW_POST_DATA 是marked deprecated,我猜你有点不走运。我不知道替代方案。

        编辑:好吧,你可以试试php://stdin / STDIN,虽然我不知道这是否适用于网络服务器中的 PHP ...也许只是尝试一下。

        【讨论】:

          猜你喜欢
          • 2015-10-12
          • 2015-10-18
          • 1970-01-01
          • 1970-01-01
          • 2019-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多