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

How to convert base64 encoded attachment to file (PDF, msg, eml)

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

可能让您感到困惑的一件事是 <compressed> 标志。因为这是真的,数据也被 gzip 压缩,所以附件从 byte[] 开始,然后被 gzip 压缩,分成块,并进行 base64 编码(每个块!)。

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