【问题标题】:How to efficiently POST binary data from node.js to PHP如何有效地将二进制数据从 node.js 发布到 PHP
【发布时间】: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 数据?

【问题讨论】:

  • 数据包有多大?你可能只是 base64 编码它。
  • @AlexHowansky 我试图避免使用 base 64。每个请求的数据高达 0.5MiB。
  • @SimonK 这是我遇到问题的接收端。
  • 您发送的 JSON 数据包带有刚刚粘贴到末尾的二进制 blob?如果您的 JSON 数据包中的任何位置包含换行符,则解码将中断。只需将 blob 编码为文本并将其嵌入 JSON。 base64有什么问题?如果你担心空间,先gzip,然后b64,就像两个函数调用一样,完成。

标签: php node.js http post


【解决方案1】:

从 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
}

【讨论】:

  • 为了防止'Missing boundary in multipart/form-data',使用headers: formData.getHeaders()而不是headers: { "Content-Type": "multipart/form-data" }
【解决方案2】:

我刚刚发现了 PUT。它完全符合我的要求。只需要改变

axios.post(url, buf)

axios.put(url, buf)

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

虽然这让我可以做我想做的事,但以这种方式使用它违反了HTTP specification。就我而言,这没什么大不了的,因为它是在内部使用的,它可以防止一些 PHP 不必要的(对于这种情况)预处理和文件 I/O。

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 2023-03-20
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多