У нас есть файл 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);
Одна вещь, которая может сбить вас с толку, это то, что <compressed>
флаг. Поскольку это выглядит как истина, данные также распаковываются, поэтому вложения начинаются с байта [], который затем распаковывается, разбивается на куски и кодируется в base64 (для каждого чанка!).
Я не знаю, как это сделать в php, но эта стратегия должна работать:
Декодирование Base64 каждого чанка даст вам байт [] на чанк.
Объедините эти куски в порядке расположения, чтобы получить один большой поток байтов.
Gunzip этот поток в другой большой поток байтов, который должен быть вашим файлом.
Других решений пока нет …