Как преобразовать вложение в кодировке base64 в файл (PDF, msg, eml)

У нас есть файл 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);

0

Решение

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]