PHP Base64编码JSON斜杠问题

4
我正在使用 Elastic-PHP API 2.0 来创建一个包含Word和PDF文档的索引。通常需要将文档的Base64编码作为JSON发送给其Mapper attachment plugin

然而,PHP的Base64在编码字符串中生成反斜杠\。我试图用这个编码构造的JSON无法被Elastic解析:

$json = 
    '{"content" : "'.addslashes(chunk_split(base64_encode($file_contents))).'"}'

我不想移除/替换斜杠,就像一些Stackoverflow帖子中建议的那样,因为这可能会在解码时导致问题。

在这种情况下,Base64编码中的斜杠如何处理?

2个回答

7

最好不要自己构建JSON字符串,而是让json_encode完成这项工作,它会处理斜杠。这样就不需要使用addslashes函数了:

// create the object
$obj = array(
    "content" => chunk_split(base64_encode($file_contents))
);
// encode the object in JSON format
$json = json_encode($obj);

请注意,使用chunk_split插入的新行字符将在编码过程中进行转义,因为JSON不允许字符串中出现未转义的换行符。如果接收端以正确的方式解码JSON字符串,则会得到上面代码中$obj变量的值,并且content带有换行符。
Elastic博客文章中,作者甚至从base64编码的字符串中删除任何换行符。其中Scala代码如下:
"image" :"${new BASE64Encoder().encode(data).replaceAll("[\n\r]", "")}"
这确实表明你不应该使用chunk_split,因此建议的PHP代码如下:
// create the object
$obj = array(
    "content" => base64_encode($file_contents)
);
// encode the object in JSON format
$json = json_encode($obj);

-2
请使用 PHP 函数 addslashes() 来添加斜杠或任何特殊字符,要检索斜杠,请使用 stripslashes()。
谢谢...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接