如何有效地POST二进制数据从node.js到PHP

How to efficiently POST binary data from node.js to PHP

我正在使用 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 数据吗?

我刚刚发现 PUT。它正是我正在寻找的。只需要改变

axios.post(url, buf)

axios.put(url, buf)

在 PHP 方面,没有尝试解码任何内容 - 由脚本来解释数据。

虽然这允许我做我想做的事,但以这种方式使用它违反了 HTTP specification。在我的例子中,这没什么大不了的,因为它是在内部使用的,它可以防止一些 PHP 不必要的(对于这种情况)pre-processing 和文件 I/O.

从 json 中分离文件:

let formData = new FormData();
formData.append('file', fs.createReadStream(filepath));
formData.append('json', '{"jsonstring":"values"}');
axios.post(url, formData, {
    headers: {
      "Content-Type": "multipart/form-data",
    },
  }).then((response) => {
    fnSuccess(response);
  }).catch((error) => {
    fnFail(error);
  });

和PHP

$jsonstring  = $_POST['json'];
$json = json_decode($jsonstring,true); // array

$uploaddir = "path/to/uploads/";
$uploadfile = $uploaddir . basename( $_FILES['file']['name']);

if(move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile))
{
  $uploadfile // is the path to file uploaded
}