Вывести размер файла php

Обновлено: 07.07.2024

В PHP-скрипте обработка загруженных через форму происходит через глобальный массив $_FILES , рассмотрим его содержимое:

Загрузка одного файла

Чтобы форма отправила файл, необходимо использовать только метод POST для отправки данных и добавить к тегу <form> атрибут enctype="multipart/form-data" , который определяет способ кодирования данных формы при их отправке на сервер.

Код скрипта index.php:

Результат:

Описание значений массива $_FILES :

Загрузка несколько файлов

Для загрузки сразу нескольких файлов к <input type="file"> нужно добавить атрибут multiple , а к имени поля – [] .

Код скрипта index.php

Результат:

Как видно, структура массива разделена по свойствам, а не по файлам. Для удобства работы с циклом foreach массив $_FILES можно преобразовать:

Результат:

Максимальный размер загружаемого файла

Размер загружаемого файла можно ограничить, добавив в форму скрытое поле с максимальным размером файла <input type="hidden" name="MAX_FILE_SIZE" value="2097152"> :

Коды ошибок загрузки файлов

Код Константа Описание
0 UPLOAD_ERR_OK Ошибок не возникло, файл успешно загружен на сервер.
1 UPLOAD_ERR_INI_SIZE Размер файла превысил максимально допустимый размер, который задан директивой upload_max_filesize
2 UPLOAD_ERR_FORM_SIZE Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.
3 UPLOAD_ERR_PARTIAL Загружаемый файл был получен только частично.
4 UPLOAD_ERR_NO_FILE Файл не был загружен.
6 UPLOAD_ERR_NO_TMP_DIR Отсутствует временная папка.
7 UPLOAD_ERR_CANT_WRITE Не удалось записать файл на диск (возникает, когда на хостинге закончилось место).
8 UPLOAD_ERR_EXTENSION PHP-расширение остановило загрузку файла.

Настройки PHP

Обычно настройки загрузки файлов на хостинге вполне нормальные и не вызывают проблем, но есть исключения. Если не загружаются большие файлы, то скорее всего установлен лимит на размер загружаемого файла, ограничено время загрузки файла или ограничено количество одновременных загрузок.

Посмотреть установленные значения можно с помощью функции phpinfo() , в разделе «Core».

(PHP 4, PHP 5, PHP 7, PHP 8)

stat — Возвращает информацию о файле

Описание

stat ( string $filename ): array | false

Собирает статистическую информацию о файле filename . Если filename является символической ссылкой, информация собирается о самом файле, а не ссылке. До PHP 7.4.0 в Windows NTS в данном случае строил статистику size , atime , mtime и ctime из символьной ссылки.

Функция lstat() идентична функции stat() за исключением того, что в данном случае она вернёт информацию о самой символической ссылке.

Список параметров

Возвращаемые значения

Формат результата работы функций stat() и fstat()
Числовой Ассоциативный Описание
0 dev номер устройства ***
1 ino номер inode ****
2 mode режим защиты inode *****
3 nlink количество ссылок
4 uid userid владельца *
5 gid groupid владельца *
6 rdev тип устройства, если устройство inode
7 size размер в байтах
8 atime время последнего доступа (временная метка Unix)
9 mtime время последней модификации (временная метка Unix)
10 ctime время последнего изменения inode (временная метка Unix)
11 blksize размер блока ввода-вывода файловой системы **
12 blocks количество используемых 512-байтных блоков **

* В Windows это всегда будет 0 .

** Доступен только на системах, поддерживающих тип st_blksize - другие системы (например, Windows) вернут -1 .

*** В Windows, начиная с PHP 7.4.0, это серийный номер тома, содержащего файл, который представляет собой 64-разрядное целое число без знака, поэтому может переполниться в 32-разрядных системах. Ранее это было числовое представление буквы диска (например, 2 для C: ) для stat() и 0 для lstat() .

**** В Windows, начиная с PHP 7.4.0, идентификатор, связанный с файлом, который представляет собой 64-разрядное целое число без знака, может переполниться в 32-разрядных системах. Ранее он всегда был 0 .

***** В Windows бит разрешения на запись устанавливается в соответствии с атрибутом файла только для чтения, одно и то же значение сообщается для всех пользователей, группы и владельца. ACL не учитывается, в отличие от is_writable() .

Значение mode содержит информацию, читаемую несколькими функциями. При записи в восьмеричном виде, начиная справа, первые три цифры возвращаются функцией chmod() . Следующая цифра игнорируется PHP. Следующие две цифры указывают тип файла:

mode типов файлов
mode в восьмеричном виде Значение
0140000 сокет
0120000 символическая ссылка
0100000 обычный файл
0060000 блочное устройство
0040000 директория
0020000 символьное устройство
0010000 fifo
Так, например, обычный файл может быть 0100644 , а директория может быть 0040755 .

В случае возникновения ошибки stat() возвращает false .

Замечание: Так как тип integer в PHP является целым числом со знаком, и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2 Гб.

Ошибки

В случае возникновения ошибки будет сгенерирована ошибка уровня E_WARNING .

Список изменений

Версия Описание
7.4.0 В Windows номер устройства теперь является серийным номером тома, содержащего файл и номер inode - это идентификатор, связанный с файлом.
7.4.0 Статистика символьных ссылок size , atime , mtime и ctime всегда соответствует статистике целевого объекта. Это было ранее не характерно для NTS -сборки на Windows.

Примеры

<?php
/* Получаем статистику файла */
$stat = stat ( 'C:\php\php.exe' );

/*
* Выводим последнее время доступа к файлу, это то же самое, что и
* вызов fileatime()
*/
echo 'Последнее время доступа: ' . $stat [ 'atime' ];

/*
* Выводим время изменения файла, это то же самое, что и
* вызов filemtime()
*/
echo 'Время изменения: ' . $stat [ 'mtime' ];

/* Выводим номер устройства */
echo 'Номер устройства: ' . $stat [ 'dev' ];
?>

<?php
/* Получаем статистику файла */
$stat = stat ( 'C:\php\php.exe' );

/* Удалось получить эту статистику? */
if (! $stat ) echo 'вызов stat() не удался. ' ;
> else /*
* Мы хотим увеличить время последнего доступа к файлу
* на 1 неделю вперёд.
*/
$atime = $stat [ 'atime' ] + 604800 ;

/* Касаемся файла */
if (! touch ( 'some_file.txt' , time (), $atime )) echo 'Не удалось коснуться файла. ' ;
> else echo 'touch() выполнился успешно. ' ;
>
>
?>

Примечания

Замечание:

Учтите, что обработка времени может отличаться в различных файловых системах.

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache() .

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat() , смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • lstat() - Возвращает информацию о файле или символической ссылке
  • fstat() - Получает информацию о файле, используя открытый файловый указатель
  • filemtime() - Возвращает время последнего изменения файла
  • filegroup() - Получает идентификатор группы файла
  • SplFileInfo

User Contributed Notes 18 notes

On GNU/Linux you can retrieve the number of currently running processes on the machine by doing a stat for hard links on the '/proc' directory like so:

$ stat -c '%h' /proc
118

You can do the same thing in php by doing a stat on /proc and grabbing the [3] 'nlink' - number of links in the returned array.

Here is the function I'm using, it does a clearstatcache() when called more than once.

// check if php version supports clearstatcache params, but only check once
if ( is_null ( $ver ) )
$ver = version_compare ( PHP_VERSION , '5.3.0' , '>=' );

// Only call clearstatcache() if function called more than once */
if ( $runs ++ > 0 ) < // checks if $runs > 0, then increments $runs by one.

// if php version is >= 5.3.0
if ( $ver ) clearstatcache ( true , '/proc' );
> else // if php version is < 5.3.0
clearstatcache ();
>
>

$stat = stat ( '/proc' );

// if stat succeeds and nlink value is present return it, otherwise return 0
return ( ( false !== $stat && isset( $stat [ 3 ] ) ) ? $stat [ 3 ] : 0 );
>

<?php
$num_procs = get_process_count ();
var_dump ( $num_procs );
?>

The above example will output:

Which is the number of processes that were running.

Give it a filename, and it returns an array like stat.

function alt_stat ( $file )

clearstatcache ();
$ss =@ stat ( $file );
if(! $ss ) return false ; //Couldnt stat file

$ts =array(
0140000 => 'ssocket' ,
0120000 => 'llink' ,
0100000 => '-file' ,
0060000 => 'bblock' ,
0040000 => 'ddir' ,
0020000 => 'cchar' ,
0010000 => 'pfifo'
);

$p = $ss [ 'mode' ];
$t = decoct ( $ss [ 'mode' ] & 0170000 ); // File Encoding Bit

$str =( array_key_exists ( octdec ( $t ), $ts ))? $ts [ octdec ( $t )]< 0 >: 'u' ;
$str .=(( $p & 0x0100 )? 'r' : '-' ).(( $p & 0x0080 )? 'w' : '-' );
$str .=(( $p & 0x0040 )?(( $p & 0x0800 )? 's' : 'x' ):(( $p & 0x0800 )? 'S' : '-' ));
$str .=(( $p & 0x0020 )? 'r' : '-' ).(( $p & 0x0010 )? 'w' : '-' );
$str .=(( $p & 0x0008 )?(( $p & 0x0400 )? 's' : 'x' ):(( $p & 0x0400 )? 'S' : '-' ));
$str .=(( $p & 0x0004 )? 'r' : '-' ).(( $p & 0x0002 )? 'w' : '-' );
$str .=(( $p & 0x0001 )?(( $p & 0x0200 )? 't' : 'x' ):(( $p & 0x0200 )? 'T' : '-' ));

$s =array(
'perms' =>array(
'umask' => sprintf ( "%04o" ,@ umask ()),
'human' => $str ,
'octal1' => sprintf ( "%o" , ( $ss [ 'mode' ] & 000777 )),
'octal2' => sprintf ( "0%o" , 0777 & $p ),
'decimal' => sprintf ( "%04o" , $p ),
'fileperms' =>@ fileperms ( $file ),
'mode1' => $p ,
'mode2' => $ss [ 'mode' ]),

'owner' =>array(
'fileowner' => $ss [ 'uid' ],
'filegroup' => $ss [ 'gid' ],
'owner' =>
( function_exists ( 'posix_getpwuid' ))?
@ posix_getpwuid ( $ss [ 'uid' ]): '' ,
'group' =>
( function_exists ( 'posix_getgrgid' ))?
@ posix_getgrgid ( $ss [ 'gid' ]): ''
),

'file' =>array(
'filename' => $file ,
'realpath' =>(@ realpath ( $file ) != $file ) ? @ realpath ( $file ) : '' ,
'dirname' =>@ dirname ( $file ),
'basename' =>@ basename ( $file )
),

'filetype' =>array(
'type' => substr ( $ts [ octdec ( $t )], 1 ),
'type_octal' => sprintf ( "%07o" , octdec ( $t )),
'is_file' =>@ is_file ( $file ),
'is_dir' =>@ is_dir ( $file ),
'is_link' =>@ is_link ( $file ),
'is_readable' => @ is_readable ( $file ),
'is_writable' => @ is_writable ( $file )
),

'device' =>array(
'device' => $ss [ 'dev' ], //Device
'device_number' => $ss [ 'rdev' ], //Device number, if device.
'inode' => $ss [ 'ino' ], //File serial number
'link_count' => $ss [ 'nlink' ], //link count
'link_to' =>( $s [ 'type' ]== 'link' ) ? @ readlink ( $file ) : ''
),

'size' =>array(
'size' => $ss [ 'size' ], //Size of file, in bytes.
'blocks' => $ss [ 'blocks' ], //Number 512-byte blocks allocated
'block_size' => $ss [ 'blksize' ] //Optimal block size for I/O.
),

'time' =>array(
'mtime' => $ss [ 'mtime' ], //Time of last modification
'atime' => $ss [ 'atime' ], //Time of last access.
'ctime' => $ss [ 'ctime' ], //Time of last status change
'accessed' =>@ date ( 'Y M D H:i:s' , $ss [ 'atime' ]),
'modified' =>@ date ( 'Y M D H:i:s' , $ss [ 'mtime' ]),
'created' =>@ date ( 'Y M D H:i:s' , $ss [ 'ctime' ])
),
);

clearstatcache ();
return $s ;
>

Array(
[perms] => Array
(
[umask] => 0022
[human] => -rw-r--r--
[octal1] => 644
[octal2] => 0644
[decimal] => 100644
[fileperms] => 33188
[mode1] => 33188
[mode2] => 33188
)

[filetype] => Array
(
[type] => file
[type_octal] => 0100000
[is_file] => 1
[is_dir] =>
[is_link] =>
[is_readable] => 1
[is_writable] => 1
)

[owner] => Array
(
[fileowner] => 035483
[filegroup] => 23472
[owner_name] => askapache
[group_name] => grp22558
)

[file] => Array
(
[filename] => /home/askapache/askapache-stat/htdocs/ok/g.php
[realpath] =>
[dirname] => /home/askapache/askapache-stat/htdocs/ok
[basename] => g.php
)

[device] => Array
(
[device] => 25
[device_number] => 0
[inode] => 92455020
[link_count] => 1
[link_to] =>
)

[size] => Array
(
[size] => 2652
[blocks] => 8
[block_size] => 8192
)

[time] => Array
(
[mtime] => 1227685253
[atime] => 1227685138
[ctime] => 1227685253
[accessed] => 2008 Nov Tue 23:38:58
[modified] => 2008 Nov Tue 23:40:53
[created] => 2008 Nov Tue 23:40:53
)
)

Собирает статистическую информацию о файле filename . Если filename является символической ссылкой, информация собирается о самом файле, а не ссылке.

Функция lstat() идентична функции stat() за исключением того, что в данном случае она вернёт информацию о самой символической ссылке.

Список параметров

Возвращаемые значения

Формат результата работы функций stat() и fstat()
Числовой Ассоциативный Описание
0 dev номер устройства
1 ino номер inode *
2 mode режим защиты inode
3 nlink количество ссылок
4 uid userid владельца *
5 gid groupid владельца *
6 rdev тип устройства, если устройство inode
7 size размер в байтах
8 atime время последнего доступа (временная метка Unix)
9 mtime время последней модификации (временная метка Unix)
10 ctime время последнего изменения inode (временная метка Unix)
11 blksize размер блока ввода-вывода файловой системы **
12 blocks количество используемых 512-байтных блоков **
* В Windows это всегда будет 0.

** Доступен только на системах, поддерживающих тип st_blksize - другие системы (например, Windows) вернут -1.

В случае ошибки stat() возвращает FALSE .

Замечание: Так как тип integer в PHP является целым числом со знаком и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2ГБ.

Ошибки

В случае ошибки будет сгенерирована ошибка уровня E_WARNING .

Примеры

<?php
/* Получаем статистику файла */
$stat = stat ( 'C:\php\php.exe' );

/*
* Выводим последнее время доступа к файлу, это тоже самое, что и
* вызов fileatime()
*/
echo 'Последнее время доступа: ' . $stat [ 'atime' ];

/*
* Выводим время изменения файла, это тоже самое, что и
* вызов filemtime()
*/
echo 'Время изменения: ' . $stat [ 'mtime' ];

/* Выводим номер устройства */
echo 'Номер устройства: ' . $stat [ 'dev' ];
?>

<?php
/* Получаем статистику файла */
$stat = stat ( 'C:\php\php.exe' );

/* Удалось получить эту статистику? */
if (! $stat ) echo 'вызов stat() не удался. ' ;
> else /*
* Мы хотим увеличить время последнего доступа к файлу
* на 1 неделю вперед.
*/
$atime = $stat [ 'atime' ] + 604800 ;

/* Касаемся файла */
if (! touch ( 'some_file.txt' , time (), $atime )) echo 'Не удалось коснуться файла. ' ;
> else echo 'touch() выполнился успешно. ' ;
>
>
?>

Примечания

Замечание:

Учтите, что обработка времени может отличаться в различных файловых системах.

Замечание: Результаты этой функции кэшируются. Более подробную информацию смотрите в разделе clearstatcache() .

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обертками url. Список оберток, поддерживаемых семейством функций stat() , смотрите в Поддерживаемые протоколы и обработчики (wrappers).

С помощью функции file_get_contents() можно получить содержимое файла:

Также мы можем получить html-код какой-либо страницы в интернете:

Но работает это далеко не для всех сайтов, у многих есть защита от такого примитивного парсинга.

Чтение файла: file()

Функция file() позволяет получить содержимое файла в виде массива. Разделителем элементов является символ переноса строки.

Создадим в корне сайта файл data.txt со следующим содержимым:

Теперь запустим скрипт index.php со следующим кодом:

При запуске этого скрипта мы получим в браузере:

Заметили, что у первых двух строк длина 7 символов вместо пяти? Это из-за того, что каждая строка содержит в конце символы переноса строки.

Чаще всего они нам не нужны, поэтому их можно убрать, передав вторым параметром константу FILE_IGNORE_NEW_LINES :

Теперь у всех строк будет по 5 символов.

Если нам необходимо получить только заполненные строки в файле и пропустить пустые, можно передать вторым параметром константу FILE_SKIP_EMPTY_LINES :

Разумеется, мы можем передать сразу две константы:

Создание файла и запись в файл: file_put_contents()

Функция file_put_contents() позволяет создать файл и заполнить его данными.

Первым параметром функция принимает путь к файлу, вторым - строку с данными. Для создания пустого файла нужно передать вторым параметром пустую строку.

Если файла не существует - он будет создан. Если существует - данные в файле будут перезаписаны.

Чтобы не перезаписывать данные, а добавить их в конец файла, нужно передать третьим параметром константу FILE_APPEND :

Также вторым параметром можно передать массив:

Но этот вариант не очень удобен, поскольку все элементы массива запишутся подряд, без каких-либо разделителей. Чтобы их добавить, можно использовать функцию implode:

Создание папки или структуры папок

Создать папку можно с помощью функции mkdir() (make directory):

Вторым параметром указываются права доступа к файлу в виде восьмеричного числа, по-умолчанию это 0777 , что означает самые широкие права. Для Windows этот аргумент игнорируется.

Кроме этого, второй параметр может игнорироваться при заданной umask (пользовательская маска (user mask), которая нужна для определения конечных прав доступа). В этом случае принудительно сменить права можно функцией chmod() :

Также мы можем создать структуру папок рекурсивно, для этого нужно третьим параметром передать true :

Но в этом случае права доступа будут заданы только для конечной папки. Для изменения прав у каждой из папок придётся указывать права вручную:

Права доступа - это отдельная объёмная тема, поэтому сейчас мы её пока рассматривать не будем.

Проверка существования файла или папки

Проверить существование папки или файла можно с помощью функции file_exists() :

Если вы хотите проверить существование только папки или только файла, для этого есть специальные функции is_dir() и is_file() :

Проверка прав доступа

Функции is_readable() и is_writable() проверяют, есть ли у пользователя, от имени которого запущен PHP, права на чтение и запись файла или папки:

Копирование, перенос и удаление файла

Для удаления файлов используется функция unlink() :

Чтобы скопировать файл, используем функцию copy() :

Для переименования и переноса файла в другую папку используется функция rename() :

Работа с файлами с помощью fopen()

Функций file() , file_get_contents() и file_put_contents() достаточно для решения большинства задач, связанных с управлением файлами.

Но иногда возникают ситуации, когда нам необходимы более продвинутые инструменты. Например, если у нас есть большой текстовый файл и мы хотим читать его построчно, а не весь сразу, для экономии оперативной памяти.

Итак, открыть (или создать и открыть) файл можно с помощью функции fopen() :

Функция fopen() возвращает так называемый лескриптор. Это ссылка, указатель на файл, его мы будем передавать в другие функции. Кстати, тип данных этого дескриптора - resource .

Первым параметром мы передаём путь к файлу, вторым - модификатор доступа к файлу. Ниже перечислены наиболее популярные модификаторы:

  • r - открытие для чтения, указатель переходит в начало файла.
  • r+ - открытие для чтения и записи, указатель переходит в начало файла.
  • w - открытие для записи, указатель переходит в начало файла. Если файла нет - создаётся, если есть - очищается от данных.
  • w+ - открытие для чтения и записи, в остальном аналогичен w .
  • a - открытие для записи, указатель переходит в конец файла. Если файла нет - создаётся.
  • a+ - открытие для чтения и записи, в остальном аналогичен a .
  • x - создание и открытие для записи, указатель переходит в начало файла. Если файл существует - PHP покажет ошибку.
  • x+ - создание и открытие для чтения и записи, в остальном аналогичен x .

Указатель - это нечто вроде курсора. Вы можете переместить его в любое место файла, чтобы добавить или отредактировать определённые данные.

Для записи данных в файл существует функция fwrite() . Давайте попробуем создать файл и записать в него какие-нибудь данные:

Заметьте, из-за модификатора w при каждом запуске скрипта данные в файле стираются и добавляются заново. Если модификатор заменить на a , данные будут не перезаписываться, а добавляться в конец файла.

Для построчного чтения файла используется функция fgets() :

При каждом запуске fgets получает следующую строку и возвращает её в $line . Вторым параметром передаётся максимальная длина строки. Это означает, что если строка слишком длинная, она будет обрезана.

Также в PHP существует множество других полезных функций, работающих с дескриптором файла. Почитать о них можно в документации.

Читайте также: