如何将base64编码的附件转换为文件(PDF,msg,eml)

时间:2018-10-22 19:46:12

标签: php xml pdf base64 servicenow

我们有一个从 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);

1 个答案:

答案 0 :(得分:1)

可能使您绊倒的一件事是<compressed>标志。由于这是正确的,所以数据也被压缩,因此附件从byte []开始,然后被压缩,分解成块并进行base64编码(每块!)。

我不知道具体如何在php中执行此操作,但是此策略应该有效: 每个块的Base64解码将为每个块提供一个byte []。 按位置顺序组合这些块,以提供一个大字节流 将数据流压缩成另一个大字节流,应该是您的文件。