如何有效地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
}
我正在使用 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
}