DOMDocument::save
Создаёт XML-документ из представления DOM. Эту функцию обычно вызывают после построения нового DOM-документа, как показано в примере ниже.
Список параметров
Путь к файлу, в который будет сохранён XML-документ.
Дополнительные настройки. На данный момент поддерживается только LIBXML_NOEMPTYTAG.
Возвращаемые значения
Возвращает количество записанных байт или false в случае возникновения ошибки.
Примеры
Пример #1 Сохранение DOM-дерева в файл
$doc = new DOMDocument ( ‘1.0’ );
// мы хотим красивый вывод
$doc -> formatOutput = true ;
$root = $doc -> createElement ( ‘book’ );
$root = $doc -> appendChild ( $root );
$title = $doc -> createElement ( ‘title’ );
$title = $root -> appendChild ( $title );
$text = $doc -> createTextNode ( ‘This is the title’ );
$text = $title -> appendChild ( $text );
echo ‘Записано: ‘ . $doc -> save ( «/tmp/test.xml» ) . ‘ байт’ ; // Записано: 72 байт
Смотрите также
- DOMDocument::saveXML() — Сохраняет XML-дерево из внутреннего представления в виде строки
- DOMDocument::load() — Загрузка XML из файла
- DOMDocument::loadXML() — Загрузка XML из строки
User Contributed Notes 6 notes
15 years ago
It took me forever to discover that
DOMDocument->formatOutput = true
will only have an effect on documents that are loaded from disk if one also sets
DOMDocument->preserveWhiteSpace = false .
Hope this saves somebody a headache.
17 years ago
The XML parser converts the text of an XML document into UTF-8, even if you have set the character encoding of the XML, for example as a second parameter of the DOMDocument constructor. After parsing the XML with the load() command all its texts have been converted to UTF-8.
In case you append text nodes with special characters (e. g. Umlaut) to your XML document you should therefore use utf8_encode() with your text to convert it into UTF-8 before you append the text to the document. Otherwise you will get an error message like «output conversion failed due to conv error» at the save() command. See example below:
// Text to insert into XML below
$txt = «a text with special characters like ‘ä’, ‘ß’, ‘Ü’ etc.» ;
// Create Instance of DOMDocument
$dom = new DOMDocument ;
// Load XML file
// Was created before with DOMDocument(‘1.0’, ‘iso-8859-1’)
$dom = $dom -> load ( «file.xml» );
// Find the parent node
$parent = $dom -> documentElement ;
// Create Instance of DomXPath
$xpath = new DomXPath ( $dom );
// new node will be inserted before this node
$next = $xpath -> query ( «//parentnode/childnode» );
// Create the new element
$new_elem = $dom -> createElement ( ‘new_elem’ );
// Insert the new element
$parent -> insertBefore ( $new_elem , $next -> item ( 0 ));
// DOMXML = utf-8! (will be converted to iso-8859-1 only at ‘save()’)
// prevents error message «output conversion failed due to conv error» at ‘save()’
$txt = utf8_encode ( $txt );
// Create new text node with utf-8 encoded string
$nodetext = $dom -> createTextNode ( » $txt » );
// Append text node to new element
$nodetext = $new_elem -> appendChild ( $nodetext );
// save
$dom -> save ( «file.xml» );
?>
Hope this helps someone.
9 years ago
When creating a DOMDocument from scratch and saving it, the encoding will be utf-8, although it’s declared as iso-8859-1.
When loading an XML-file declared and saved as iso-8859-1, php will keep the correct encoding when it’s saved after changes are made.
Php converts files declared as iso-8859-1 to utf-8 internally. To add text containing special characters, the text must be encoded as utf-8. When the document is saved, special characters are converted to iso-8859-1.
To save an xml created from scratch, use fopen/fwrite and utf8_decode:
$doc = new DOMDocument(‘1.0’, ‘iso-8859-1’);
//Add som nodes and text with apropriate methods
$f = fopen(‘xmlfile.xml’, ‘w+’);
fwrite($f, utf8_decode($doc->saveXML()));
fclose($f);
7 years ago
I just intend to bring my little contribution to the use of DOMDocument::save() function along with PHP serialize() function.
Sometimes you could have to serialize a PHP object before you put it into a XML structure (or other..). And then I suppose you could have to save this XML structure in a file. Of course, you will further need to read this file and unserialize it before to use its content.
The problem appears when there are some properties described as Protected in the object to be serialized.
As it’s written in the PHP documentation, serialize function add for those protected properties an asterisk before the name of the property along with a NULL character on each side of the asterisk.
In this case, the DOMDocument::save function will stop the save operation just before the first NULL character met in the string to be saved, because PHP consider it as a potential risk.
So, after that, the unserialize operation of the file become impossible.
To solve that, here is a first solution to apply :
For the serialize , before the DOMDocument::save() ::
$data_serial = explode(«\x00\x2A\x00», serialize($object)); //take off the ‘NULL * NULL’ string
$data_serial = implode(«\x5C\x30\x2A\x5C\x30», $data_serial); //and replace with ‘\0*\0’ string
Before the unserialize :
$data_serial = explode(«\x5C\x30\x2A\x5C\x30», $serialized_object); // take off the ‘\0*\0’ string
$serial_object = implode(«\x00\x2A\x00», $data_serial); // and replace with ‘NULL * NULL’ string as included by the previous serialize
And a second solution :
For the serialize, before the DOMDocument::save() :
$serialized_object = addslashes(serialize($object)) ;
Before re-using the object in your application :
$object = unserialize(stripslashes($serialized_object)) ;
Hope this will help some.
PHP — как сохранить файл в папку на сервере?

PHP — как сохранить файл в папку на сервере? Простая задача — но … так ли она проста, тем более — для новичка?
Итак, у нас будет следующая техническая задача:
1. Создание формы, с помощью которой мы будем получать название файла, который мы хотим отправить в папку на сервере
2. Обработка данных в этой форме
3. Отправка файла на сервер
Поехали!
Для решения задачи по созданию формы — создаем ее (кто не знает как — можете прочитать тут). .Форма будет состоять из поля «Файл» и кнопки, которая передает данные:
Из интересного — в поле с типом данных «Файл» мы специально сужаем возможность загрузки посторонних файлов на сервер — разрешаем грузить только картинки. Делается это с помощью
accept=»image/*
Как видно из кода формы — за обработку данных у нас будет отвечать файл add_to_base.php. Выглядит он следующим образом:
?php $path = "pic/".$_FILES['photo']['name']; if(move_uploaded_file($_FILES['photo']['tmp_name'],$path)) { echo $_FILES['photo']['name'].' успешно загружен'; } ?
рассмотрим код более подробно:
fwrite
fwrite() записывает содержимое data в файловый поток stream .
Список параметров
Указатель ( resource ) на файл, обычно создаваемый с помощью функции fopen() .
Если параметр length является целым числом ( int ), запись остановится после того, как length байтов будут записаны или будет достигнут конец строки data , смотря что произойдёт раньше.
Возвращаемые значения
fwrite() возвращает количество записанных байт или false в случае возникновения ошибки.
Ошибки
Функция fwrite() выдаёт ошибку уровня E_WARNING в случае возникновения ошибки.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 | Параметр length теперь допускает значение null . |
Примеры
Пример #1 Простой пример использования fwrite()
$filename = ‘test.txt’ ;
$somecontent = «Добавить это к файлу\n» ;
?php
// Вначале давайте убедимся, что файл существует и доступен для записи.
if ( is_writable ( $filename ))
// В нашем примере мы открываем $filename в режиме «записи в конец».
// Таким образом, смещение установлено в конец файла и
// наш $somecontent допишется в конец при использовании fwrite().
if (! $fp = fopen ( $filename , ‘a’ )) echo «Не могу открыть файл ( $filename )» ;
exit;
>
// Записываем $somecontent в наш открытый файл.
if ( fwrite ( $fp , $somecontent ) === FALSE ) echo «Не могу произвести запись в файл ( $filename )» ;
exit;
>
echo «Ура! Записали ( $somecontent ) в файл ( $filename )» ;
> else echo «Файл $filename недоступен для записи» ;
>
?>
Примечания
Замечание:
Запись в сетевой поток может прекратиться до того, как будут записаны все данные. Это можно контролировать с помощью проверки возвращаемого значения функции fwrite() :
function fwrite_stream ( $fp , $string ) for ( $written = 0 ; $written < strlen ( $string ); $written += $fwrite ) $fwrite = fwrite ( $fp , substr ( $string , $written ));
if ( $fwrite === false ) return $written ;
>
>
return $written ;
>
?>?php
Замечание:
В системах, различающих двоичные и текстовые файлы (к примеру, Windows), файл должен быть открыт используя флаг ‘b’ в конце аргумента mode функции fopen() .
Замечание:
Если дескриптор stream был открыт функцией fopen() в режиме «добавление в конец», то вызовы fwrite() будут атомарными (за исключением случая, если размер data превысит размер блока файловой системы, на некоторых платформах, и пока файл хранится на локальной файловой системе). То есть нет необходимости блокировать ресурс с помощью flock() перед вызовом fwrite() , и все данные будут записаны без прерываний.
Замечание:
При повторной записи в файловый указатель, данные будут добавлены в конец содержимого файла:
$fp = fopen ( ‘data.txt’ , ‘w’ );
fwrite ( $fp , ‘1’ );
fwrite ( $fp , ’23’ );
fclose ( $fp );
?php
// содержимое ‘data.txt’ теперь 123, а не 23!
?>
Смотрите также
- fread() — Бинарно-безопасное чтение файла
- fopen() — Открывает файл или URL
- fsockopen() — Открывает соединение с интернет-сокетом или доменным сокетом Unix
- popen() — Открывает файловый указатель процесса
- file_get_contents() — Читает содержимое файла в строку
- pack() — Упаковать данные в бинарную строку
User Contributed Notes 33 notes
13 years ago
After having problems with fwrite() returning 0 in cases where one would fully expect a return value of false, I took a look at the source code for php’s fwrite() itself. The function will only return false if you pass in invalid arguments. Any other error, just as a broken pipe or closed connection, will result in a return value of less than strlen($string), in most cases 0.
Therefore, looping with repeated calls to fwrite() until the sum of number of bytes written equals the strlen() of the full value or expecting false on error will result in an infinite loop if the connection is lost.
This means the example fwrite_stream() code from the docs, as well as all the «helper» functions posted by others in the comments are all broken. You *must* check for a return value of 0 and either abort immediately or track a maximum number of retries.
Below is the example from the docs. This code is BAD, as a broken pipe will result in fwrite() infinitely looping with a return value of 0. Since the loop only breaks if fwrite() returns false or successfully writes all bytes, an infinite loop will occur on failure.
// BROKEN function — infinite loop when fwrite() returns 0s
function fwrite_stream ( $fp , $string ) <
for ( $written = 0 ; $written < strlen ( $string ); $written += $fwrite ) <
$fwrite = fwrite ( $fp , substr ( $string , $written ));
if ( $fwrite === false ) <
return $written ;
>
>
return $written ;
>
?>
2 years ago
if you need a function that writes all data, maybe try
/**
* writes all data or throws
*
* @param mixed $handle
* @param string $data
* @throws \RuntimeException when fwrite returned * @return void
*/
/*private static*/ function fwrite_all ( $handle , string $data ): void
$original_len = strlen ( $data );
if ( $original_len > 0 ) $len = $original_len ;
$written_total = 0 ;
for (;;) $written_now = fwrite ( $handle , $data );
if ( $written_now === $len ) return;
>
if ( $written_now < 1 ) throw new \RuntimeException ( "could only write < $written_total >/ < $original_len >bytes!» );
>
$written_total += $written_now ;
$data = substr ( $data , $written_now );
$len -= $written_now ;
// assert($len > 0);
// assert($len === strlen($data));
>
>
>
3 years ago
$handles can also be used to output in console like below example
fwrite(STDOUT, «Console Output»);
Запись в файлы и чтение файлов с помощью PHP
В этом уроке вы узнаете несколько важных функций на PHP, которые достаточны для всех ваших основных потребностей чтения и записи файлов. Вы узнаете, как читать файл, записывать в файл, записывать в текстовый файл и проверять, существует ли файл.
К счастью, PHP предоставляет множество функций для чтения и записи данных в файлы. В этом уроке я покажу вам самые простые способы чтения данных из локального или удаленного файла и способы использования флагов для записи в файлы именно так, как мы хотим.
Проверка наличия файла
Ваш первый шаг при попытке чтения данных из файла или записи чего-то в него должен состоять в том, чтобы проверить, существует ли файл уже. Попытка прочитать данные из файла, который не существует, приведет к предупреждению с PHP и, вероятно, приведет к краху вашего кода.
Самый простой способ проверить, существует ли файл, — использовать функцию PHP file_exists($filename) . Он вернет true , если файл или каталог с заданным $filename существует и false в противном случае. Это может быть очевидно, но я хотел бы указать, что $filename не обязательно должно быть именем файла. Это также может быть абсолютный или относительный путь. Например, мы могли бы использовать prime_numbers.txt или science/project/period_table.txt.
Также важно помнить, что эта функция также вернет false для файлов, которые недоступны из-за ограничений безопасного режима.
Другой функцией, которую вы можете использовать для проверки существования файла, является is_file() . В отличие от file_exists() , эта функция возвращает только true , если указанный путь указывает на файл, а не на каталог.
Убедимся, что файл фактически существует
Если код, который вы пишете, выполняет множество операций с файлами в определенном файле, вы можете получить неверные результаты, используя вышеуказанные функции. Это связано с тем, что результаты выполнения файлов file_exists() и is_file() кэшируются для повышения производительности. PHP также кэширует значения, возвращаемые другими функциями файловой системы, такими как filesize() , filemtime() и т. д.
Вы можете вызвать clearstatcache() , чтобы убедиться, что любая информация, которую вы просматриваете для файла, обновлена.
Обычно это проблема только в том случае, если к одному и тому же файлу обращаются несколько раз в одном скрипте, чтобы узнать его статус. Кроме того, кэшированные данные очищаются, если вы удаляете файл внутри скрипта с помощью функции unlink() . Это в основном означает, что вы, вероятно, не столкнетесь с какими-либо проблемами, связанными с кешированием, но по-прежнему хорошо знать, что вы можете очистить кеш, если информация устареет или вы получаете неожиданные результаты при попытке получить доступ к информации о файле.
Чтение данных из файла в PHP
Один из самых простых способов чтения данных из файла в PHP — с помощью функции file_get_contents($filename, $use_include_path, $context, $offset, $maxlen) . Он просто прочитает весь файл и передаст его вам в виде строки. Все параметры, кроме первого, являются необязательными.
Второй параметр принимает логическое значение, чтобы определить, должен ли он искать файл в местоположении, указанном путем include, который может быть задан с помощью функции set_include_path() .
Вы можете использовать третий параметр, чтобы указать набор параметров для уточнения способов доступа к файлам. Вы можете использовать его для указания значений заголовков, таких как Cookies и Host , а также HTTP-метод.
Параметр $offset определяет точку начала чтения исходного файла. Отрицательное значение начнет отсчет с конца. Поддержка отрицательных смещений была добавлена только в PHP 7.1.0. Стоит отметить, что смещение работает только с локальными файлами и не поддерживается для удаленных файлов.
Функция file_get_contents() считывает весь файл сразу по умолчанию. Вы можете изменить это поведение, указав значение параметра $maxlen . Длина символов, подлежащих чтению, подсчитывается из значения смещения.
Эта функция вернет false , если не удалось прочитать данные из указанного файла. Тем не менее, она также может возвращать значения, которые вычисляются как false , поэтому убедитесь, что вы проверяете, действительно ли он вернул false с помощью оператора === .
Вы можете использовать эту функцию для открытия удаленных файлов, но это было бы возможно, только если значение параметра allow-url-fopen в php.ini true или 1 .
Запись данных в файл в PHP
Один из самых простых способов записи данных в файл в PHP — с помощью функции file_put_contents($filename, $data, $flags, $context) .
Параметр $filename определяет файл, в котором будут записываться данные. Второй параметр — это данные, которые вы хотите записать в файл. В большинстве случаев это будет строка, но она также может быть массивом или ресурсом потока.
Помните, что PHP автоматически создаст файл с заданным именем, если он еще не существует. Однако он не создаст для вас каких-либо каталогов. Это означает, что вы можете сохранить файл с именем On the Origin of Species [Charles Darwin].txt без каких-либо ошибок. Однако установка $filename в Biology/Evolution/On Origin of Species [Charles Darwin] .txt, если Biology/Evolution/ еще не существует, приведет к ошибке.
Параметр $flags определяет, как содержимое будет записано в файл. Он может иметь любое или все из следующих трех значений:
- FILE_USE_INCLUDE_PATH — Это указывает PHP на поиск имени файла в каталоге include.
- FILE_APPEND — Это скажет PHP, чтобы добавить данные, которые вы передали функции, к существующим данным в файле. Это может быть полезно, если вы храните данные в файле, таком как журнал или личный дневник. Запись новых данных, таких как температура или события, которые произошли с вами сегодня, не будет перезаписывать то, что вы записали вчера.
- LOCK_EX — Это скажет PHP, чтобы получить блокировку файла, прежде чем начинать писать в него содержимое. Это может предотвратить непредвиденные события, когда два разных сценария читают или записывают данные в один и тот же файл. С этим конкретным значением вы получите эксклюзивную блокировку файла. Вы можете узнать больше об этих блокировках в документации PHP о функции flock() .
Эта функция возвращает количество байтов, которые были записаны в файл с успехом, и false при ошибке. Тем не менее, вы все равно должны использовать строгий оператор равенства, чтобы проверить, было ли успешным запись содержимого в файл. Это потому, что код, который записывает 0 байтов в файл, будет по-прежнему оцениваться как false.
Чтение и запись данных в файлы
Вы можете перейти на сайт Project Gutenberg и попытаться загрузить файлы с помощью функции file_get_contents() . После того, как у вас есть данные в строке, вы также можете просто сохранить их в локальном файле с помощью функции file_put_contents() . В следующем примере это будет ясно:
