我们有一个从 ServiceNow 导出的XML文件,我们正在尝试将其导入到我们的自定义PHP应用程序中。
每个附件<sys_attachment>
被分成块<sys_attachment_doc>
,由<position>
元素排序。
<sys_attachment>
<chunk_size_bytes>734003</chunk_size_bytes>
<compressed>true</compressed>
<content_type>application/pdf</content_type>
<encryption_context display_value="" />
<file_name>Filename.pdf</file_name>
</sys_attachment>
<sys_attachment_doc>
<data>[BASE64 ENCODED STRING HERE]</data>
<length>[STRING LENGTH]</length>
<position>0</position>
</sys_attachment_doc>
<sys_attachment_doc>
<data>[BASE64 ENCODED STRING HERE]</data>
<length>[STRING LENGTH]</length>
<position>1</position>
</sys_attachment_doc>
我们尝试将字符串和base64_decoding组合在一起,但无济于事。
<?php
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="servicenow.pdf"');
//echo base64_decode($chunk0.$chunk1);
echo base64_decode($chunk0).base64_decode($chunk1);
?>
我们找不到有关如何将这些附件转换为ServiceNow(PHP)外部文件的任何文档。在解码字符串并将其转换为文件(PDF)之前,还需要执行额外的步骤吗?
编辑:我设法使用@Joey答案解决它。我base64_decode的块,然后将其合并。合并的字符串实际上是gzip压缩的。我们使用gzdecode()生成PDF。
$attachment = base64_decode($chunk0).base64_decode($chunk1);
echo gzdecode($attachment);
答案 0 :(得分:1)
可能使您绊倒的一件事是<compressed>
标志。由于这是正确的,所以数据也被压缩,因此附件从byte []开始,然后被压缩,分解成块并进行base64编码(每块!)。
我不知道具体如何在php中执行此操作,但是此策略应该有效: 每个块的Base64解码将为每个块提供一个byte []。 按位置顺序组合这些块,以提供一个大字节流 将数据流压缩成另一个大字节流,应该是您的文件。