Как преобразовать вложение в кодировке base64 в файл (PDF, msg, eml) - PullRequest
0 голосов
/ 22 октября 2018

У нас есть XML-файл, экспортированный из ServiceNow , который мы пытаемся импортировать в наше пользовательское приложение 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 голосов
/ 23 октября 2018

Одна вещь, которая может сбить вас с толку, это флаг <compressed>.Поскольку это выглядит как истина, данные также распаковываются, поэтому вложения начинаются с байта [], который затем распаковывается, разбивается на куски и кодируется в base64 (на чанк!).

Я не знаю, каксделать это специально в php, но эта стратегия должна работать: декодирование Base64 каждого чанка даст вам байт [] на чанк.Комбинируйте эти фрагменты в порядке расположения, чтобы получить один большой пакет байтов для потока, который превращается в другой поток больших байтов, который должен быть вашим файлом.

...