XML не загружается, без каких-либо сообщений об ошибках

У меня есть структура XML в моем файле PHP.

Например:

$file = file_get_contents($myFile);

$response = '<?xml version="1.0"?>';
$response .= '<responses>';
$response .= '<file>';
$response .= '<name>';
$response .= '</name>';
$response .= '<data>';
$response .= base64_encode($file);
$response .= '</data>';
$response .= '</file>';
$response .= '</responses>';

echo $response;

Если я создаю файл .doc или с другим расширением и вставляю мало текста, это работает. Но, если пользователь загружает файл со сложной структурой (не только текст) — XML ​​просто не загружается, и у меня пустой файл без ошибок.

Но те же файлы работают на моем другом сервере.

У меня есть попытка использовать simplexml_load_string для ошибок вывода, но у меня нет ошибок.

Сервер с PHP 5.3.3 имеет проблему; тот с PHP 5.6 не имеет. Это работает, если я попробую это с 5.3.3 на моем локальном сервере.

Проблема из-за версии PHP? Если да, то как именно?

0

Решение

В вашем коде можно улучшить три вещи:

  1. Настройте отчеты об ошибках для фактического просмотра сообщений об ошибках.

  2. Создайте XML с соответствующей библиотекой, чтобы гарантировать, что вы не можете отправлять искаженные данные.

  3. Будьте осторожны в использовании памяти (в настоящее время вы сохраняете полный файл в ОЗУ три раза, два из них в виде простого текста, который в зависимости от типа файла может быть значительно больше).

Ваш общий код может выглядеть так:

// Quick code, needs more error checking and refining
$fp = fopen($myFile, 'rb');
if ($fp) {
$writer = new XMLWriter();
$writer->openURI('php://output');
$writer->startDocument('1.0');

$writer->startElement('responses');
$writer->startElement('file');
$writer->startElement('name');
$writer->endElement();
$writer->startElement('data');
while (!feof($fp)) {
// If I recall correctly, substring size must be multiple of 4
// to encode it properly (except for last part)
$writer->text(base64_encode(fread($fp, 10240)));
}
$writer->endElement();
$writer->endElement();
$writer->endElement();

fclose($fp);
}

Я пробовал этот код с файлом 316 МБ и использовал 256 КБ на моем ПК.

Как примечание: вставка двоичных файлов в XML довольно проблематична, когда файлы большие. Это делает извлечение проблематичным, потому что вы не можете использовать большинство обычных инструментов из-за интенсивного использования памяти.

1

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector