【发布时间】: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
【问题讨论】:
还有其他选择吗?
我正在使用Advanced Rest Client 来测试我正在开发的 API。
我使用 POST 发送 JSON。
在代码中,$_FILES 可以,但 file_get_contents("php://input") 为空。
如果我不发送任何文件,那么我可以使用file_get_contents("php://input")
PHP 版本:5.6.4
【问题讨论】:
正如 GhostGambler 所说,php://input 不适用于 enctype="multipart/form-data"。
您不应将 JSON 作为文件附加到您的请求中,而应将其作为请求正文添加到 post 请求中,并设置 Content-Type 标头 (application/json)。然后它将在php://input 中提供。
【讨论】:
enctype="multipart/form-data",php://input 将保持为空。您应该划分功能(即 REST 和所有),而不是将二进制发布数据与 json 内容相结合。好吧,基本上你有几个选择.. 1. 将图像发布到 API > 返回 ID,发布带有所需 ID 的 json(元数据?)。 2. 将文件编码为base64(更大尺寸)并发布到json文件中,解码并存储。不过,我更喜欢选项 1,更干净一些。
访问任何 POST/FILES 超全局变量最有可能消耗 php://input。
在任何情况下,如果您发送 JSON 有效负载,您也不能拥有 multipart-formdata 有效负载,因此 $_FILES 应该为空。如果您需要在同一页面上处理两者(IMO 的坏主意),请确保在访问 $_FILES 或 php://input 之前检查请求正文之外的内容类型标头或其他一些信息
【讨论】:
php://input是一个只读流,允许您读取原始数据 从请求正文。在 POST 请求的情况下,最好 使用php://input而不是$HTTP_RAW_POST_DATA,因为它没有 依赖于特殊的 php.ini 指令。此外,对于那些情况$HTTP_RAW_POST_DATA默认不填充,它可能是 激活时内存占用较少的替代方案always_populate_raw_post_data。php://input不适用于 enctype="multipart/form-data".
http://php.net/manual/de/wrappers.php.php
由于 HTTP_RAW_POST_DATA 是marked deprecated,我猜你有点不走运。我不知道替代方案。
编辑:好吧,你可以试试php://stdin / STDIN,虽然我不知道这是否适用于网络服务器中的 PHP ...也许只是尝试一下。
【讨论】: