У меня есть структура 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? Если да, то как именно?
В вашем коде можно улучшить три вещи:
Настройте отчеты об ошибках для фактического просмотра сообщений об ошибках.
Создайте XML с соответствующей библиотекой, чтобы гарантировать, что вы не можете отправлять искаженные данные.
Будьте осторожны в использовании памяти (в настоящее время вы сохраняете полный файл в ОЗУ три раза, два из них в виде простого текста, который в зависимости от типа файла может быть значительно больше).
Ваш общий код может выглядеть так:
// 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 довольно проблематична, когда файлы большие. Это делает извлечение проблематичным, потому что вы не можете использовать большинство обычных инструментов из-за интенсивного использования памяти.
Других решений пока нет …