【发布时间】:2022-02-25 08:54:57
【问题描述】:
我正在使用 Node.js 将二进制数据发送到 PHP。 POST 数据包含一个 JSON 字符串,后跟换行符,然后是二进制部分。
从节点发送数据:
let binary = null;
if('binary' in msg)
{
binary = msg.binary;
delete msg.binary;
}
let buf = Buffer.from(JSON.stringify(msg) + (binary === null ? '' : '\n'));
if(binary !== null) buf = Buffer.concat([buf, binary]);
let response = await axios.post
(
url,
buf
);
...并在 PHP 中接收它:
$binary = null;
$in = file_get_contents('php://input');
$pos = strpos($in, "\n");
if($pos === false)
{
$_POST = json_decode($in, true);
}
else
{
$_POST = json_decode(substr($in, 0, $pos), true);
$binary = substr($in, $pos + 1);
}
这可行,但我收到警告:
PHP 警告:未知:输入变量超过 1000 个。
有什么方法可以阻止 PHP 尝试解析 POST 数据?
【问题讨论】:
-
blob 会帮助你吗? developer.mozilla.org/en-US/docs/Web/API/Blob
-
数据包有多大?你可能只是 base64 编码它。
-
@AlexHowansky 我试图避免使用 base 64。每个请求的数据高达 0.5MiB。
-
@SimonK 这是我遇到问题的接收端。
-
您发送的 JSON 数据包带有刚刚粘贴到末尾的二进制 blob?如果您的 JSON 数据包中的任何位置包含换行符,则解码将中断。只需将 blob 编码为文本并将其嵌入 JSON。 base64有什么问题?如果你担心空间,先gzip,然后b64,就像两个函数调用一样,完成。