PHP DOMDocument сложность с urlencoded символов в имени файла - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть подпрограмма, которая сохраняет фрагменты XML как отдельные документы.Имя файла генерируется из одного из элементов, который может содержать символов, которые нежелательны в имени файла - например, пробел или /.Чтобы обойти это, я urlencode() сначала имя файла, поэтому вместо:

ABC DEF/123.xml

я получаю:

ABC+DEF%2F123.xml

Это прекрасно работает, если речь идет о файловой системе, но дляпо какой-то причине DOMDocument::load и DOMDocument::save оба декодируют %2F и интерпретируют его как литерал /.

. Это достаточно легко воспроизвести:

$filename = urlencode('ABC DEF/123.xml');
$dom = new DOMDocument();
$dom->save($filename);

PHPПредупреждение: DOMDocument :: save (ABC + DEF / 123.xml): не удалось открыть поток: нет такого файла или каталога в коде оболочки php в строке 1

Для простого обходного пути я делаю это:

file_put_contents($filename, $dom->saveXml());

Мой вопрос: почему эти методы ведут себя так?И есть ли свойство, которое я могу установить, или какой-то другой способ заставить эти методы работать, чтобы я мог использовать методы DOMDocument вместо file_put_contents() или тому подобное?

ОБНОВЛЕНИЕ: Просмотр php source похоже, что обработка файла делегирована xmlSaveFormatFileEnc(), которая называется " Дамп XML-документа в файл или URL ."Предположительно, этому файлу дается имя файла, так как это может быть и фактический URL.Это все еще оставляет мне много вопросов.Буду признателен за то, что кто-то хорошо разбирается в C или знаком с libxml2, чтобы прокомментировать дальше или дать реальный ответ о том, что здесь происходит.

...