Php получить метаданные файла

PHP МЕТАДАННЫЕ ФАЙЛА

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

Функция stat возвращает информацию о файле в виде массива. В этом массиве содержатся различные метаданные файла, такие как размер файла, время последнего изменения, время последнего доступа и т.д. Пример:

$fileInfo = stat(«/path/to/file»);echo «File size: » . $fileInfo[7] . » bytes
«;echo «Last modified: » . date(«F d Y H:i:s.», $fileInfo[9]);

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

$lastModified = filemtime(«/path/to/file»);echo «Last modified: » . date(«F d Y H:i:s.», $lastModified);

Тип файла может быть получен с помощью функции mime_content_type . Она возвращает тип MIME файла на основе его расширения. Пример:

$fileType = mime_content_type(«/path/to/file»);echo «File type: » . $fileType;

Кроме того, существует возможность получить информацию о файле, используя объект SplFileInfo . У этого объекта есть несколько методов для получения метаданных файла, таких как getSize , getMTime и getType . Пример:

$fileInfo = new SplFileInfo(«/path/to/file»);echo «File size: » . $fileInfo->getSize() . » bytes
«;echo «Last modified: » . date(«F d Y H:i:s.», $fileInfo->getMTime());echo «File type: » . $fileInfo->getType();

Скрытые секреты фотографий. Работа с метаданными

Работа с файлами. Практический PHP

Метаданные: Невидимая информация о файлах

Метаданные. Что и как можно найти на сайте

Уроки PHP 7 — Как сделать форму Upload файла

Источник

stream_get_meta_data

Параметр stream может быть любым потоком, созданным при помощи функций fopen() , fsockopen() , pfsockopen() и stream_socket_client() .

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

Получаемый массив содержит следующие элементы:

  • timed_out (bool) — true , если поток превысил время ожидания данных во время последнего вызова функции fread() или fgets() .
  • blocked (bool) — true , если поток находится в режиме блокирующего ввода-вывода. Смотрите функцию stream_set_blocking() .
  • eof (bool) — true , если поток достиг конца файла. Заметьте, что для потоков типа socket этот член может быть равен true , даже когда unread_bytes не равно нулю. Для того, чтобы определить есть ли ещё данные для чтения, используйте feof() вместо чтения этого элемента.
  • unread_bytes (int) — количество байт, находящихся сейчас в собственном внутреннем буфере PHP.

Примеры

Пример #1 Пример использования stream_get_meta_data() с использованием fopen() с http

if (! $fp = fopen ( $url , ‘r’ )) trigger_error ( «Невозможно открыть URL ( $url )» , E_USER_ERROR );
>

$meta = stream_get_meta_data ( $fp );

Результатом выполнения данного примера будет что-то подобное:

array(10) < 'timed_out' =>bool(false) 'blocked' => bool(true) 'eof' => bool(false) 'wrapper_data' => array(13) < [0] =>string(15) "HTTP/1.1 200 OK" [1] => string(11) "Age: 244629" [2] => string(29) "Cache-Control: max-age=604800" [3] => string(38) "Content-Type: text/html; charset=UTF-8" [4] => string(35) "Date: Sat, 20 Nov 2021 18:17:57 GMT" [5] => string(24) "Etag: "3147526947+ident"" [6] => string(38) "Expires: Sat, 27 Nov 2021 18:17:57 GMT" [7] => string(44) "Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT" [8] => string(22) "Server: ECS (chb/0286)" [9] => string(21) "Vary: Accept-Encoding" [10] => string(12) "X-Cache: HIT" [11] => string(20) "Content-Length: 1256" [12] => string(17) "Connection: close" > 'wrapper_type' => string(4) "http" 'stream_type' => string(14) "tcp_socket/ssl" 'mode' => string(1) "r" 'unread_bytes' => int(1256) 'seekable' => bool(false) 'uri' => string(23) "http://www.example.com/" >

Пример #2 Пример использования stream_get_meta_data() с использованием stream_socket_client() с https

$streamContext = stream_context_create (
[
‘ssl’ => [
‘capture_peer_cert’ => true ,
‘capture_peer_cert_chain’ => true ,
‘disable_compression’ => true ,
],
]);
$client = stream_socket_client (
‘ssl://www.example.com:443’ ,
$errorNumber ,
$errorDescription ,
40 ,
STREAM_CLIENT_CONNECT ,
$streamContext
);
$meta = stream_get_meta_data ( $client );
var_dump ( $meta );
?>

Результатом выполнения данного примера будет что-то подобное:

array(8) < 'crypto' =>array(4) < 'protocol' =>string(7) "TLSv1.3" 'cipher_name' => string(22) "TLS_AES_256_GCM_SHA384" 'cipher_bits' => int(256) 'cipher_version' => string(7) "TLSv1.3" > 'timed_out' => bool(false) 'blocked' => bool(true) 'eof' => bool(false) 'stream_type' => string(14) "tcp_socket/ssl" 'mode' => string(2) "r+" 'unread_bytes' => int(0) 'seekable' => bool(false) >

Примечания

Замечание:

Эта функция НЕ будет работать с сокетами, созданными при помощи модуля Socket.

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

User Contributed Notes 4 notes

In PHP 5.4.24 and 5.4.25, this command does not correctly return the stream blocking status. It always returns [‘blocked’] == 1 regardless of the actual blocking mode. A call to stream_set_blocking($stream, 0) will succeed (return TRUE) and subsequent calls to stream_get_contents($stream) will NOT block, even though a call to stream_get_meta_data($stream) will return ‘blocked’ == 1. Hopefully this will save some people a bunch of debugging time.

See bug report #47918 for more information (http://bugs.php.net/bug.php?id=47918).

Proof:
$d = array(
0 => array( ‘pipe’ , ‘r’ ),
1 => array( ‘pipe’ , ‘w’ ),
2 => array( ‘file’ , ‘error.log’ , ‘a’ )
);

$p = proc_open ( ‘php -S localhost:8000’ , $d , $pipes );

if (! is_resource ( $p )) die( «proc_open() failed\n» );

// Set child’s stdout pipe to non-blocking.
if (! stream_set_blocking ( $pipes [ 1 ], 0 )) die( «stream_set_blocking() failed\n» );
>
else echo «Non-blocking mode should be set.\n» ;
>

// View the status of that same pipe.
// Note that ‘blocked’ is 1! This appears to be wrong.
print_r ( stream_get_meta_data ( $pipes [ 1 ]));

// Try to read something. This will block if in blocking mode.
// If it does not block, stream_set_blocking() worked but
// stream_get_meta_data() is lying about blocking mode.
$data = stream_get_contents ( $pipes [ 1 ]);

echo «data = ‘ $data ‘\n» ;
?>

Output:
Non-blocking mode should be set.
Array
(
[stream_type] => STDIO
[mode] => r
[unread_bytes] => 0
[seekable] =>
[timed_out] =>
[blocked] => 1 // [eof] =>
)
data = » // this would never appear if we blocked.

Below is a function I wrote to pull the «Last-Modified» header from a given URL. In PHP version 4.3 and above, it takes advantage of the stream_get_meta_data function, and in older version it uses a conventional GET procedure. On failure to connect to $url, it returns NULL. If the server does not return the Last-Modified header, it returns the current time. All times are returned in PHP’s integer format (seconds since epoch).

$last_modified = stream_last_modified(‘http://www.php.net/news.rss’);
if (!is_null($last_modified))
if ($last_modified < time()-3600) //Older than an hour
echo ‘URL is older than an hour.’;
else
echo ‘URL is fairly new.’;
else
echo ‘Invalid URL!’;

$meta = stream_get_meta_data($fp);
for ($j = 0; isset($meta[‘wrapper_data’][$j]); $j++)
if (strstr(strtolower($meta[‘wrapper_data’][$j]), ‘last-modified’))
$modtime = substr($meta[‘wrapper_data’][$j], 15);
break;
>
>
fclose($fp);
>
else
$parts = parse_url($url);
$host = $parts[‘host’];
$path = $parts[‘path’];

if (!($fp = @fsockopen($host, 80)))
return NULL;

$req = «HEAD $path HTTP/1.0\r\nUser-Agent: PHP/».phpversion().»\r\nHost: $host:80\r\nAccept: */*\r\n\r\n»;
fputs($fp, $req);

while (!feof($fp))
$str = fgets($fp, 4096);
if (strstr(strtolower($str), ‘last-modified’))
$modtime = substr($str, 15);
break;
>
>
fclose($fp);
>
return isset($modtime) ? strtotime($modtime) : time();
>

here is just an example how to read out all meta data.
how ever I found out that the «seekable»-entry doesn’t exist in most of the streaming media files.

if (!($fp = @fopen($url, ‘r’)))
return NULL;

Источник

Функции для работы с потоками

I can’t find any real documentation on the quoted-printable-encode stream filter, but I’ve gathered info from several places. It seems there are 4 options that can be passed in the param array as in my other note on this subject:

line-length: integer, simply sets line length before a soft break is inserted
line-break-chars: Which char or chars to consider as a line break — note that «\r\n» will only match CRLF, not CR or LF, so make sure it matches your content.
binary: boolean, hex encodes all control chars, including spaces and line breaks, but leaves alphanumerics untouched
force-encode-first: Forcibly hex-encodes the first char on each line, even if it’s alphanumeric. This is useful for avoiding corruption in some incompetent mail servers, like Exchange.

As this article says, there is no quoted_printable_encode function() in PHP: http://www.zend.com/manual/filters.convert.php

However there is a stream filter for quoted printable encoding. Here’s an example function that produces output suitable for email and doesn’t explicitly use external files (though it might do for strings over 2Mb due to the nature of the temp stream type):

function quoted_printable_encode ( $string ) $fp = fopen ( ‘php://temp/’ , ‘r+’ );
$params = array( ‘line-length’ => 70 , ‘line-break-chars’ => «\r\n» );
stream_filter_append ( $fp , ‘convert.quoted-printable-encode’ , STREAM_FILTER_READ , $params );
fputs ( $fp , $string );
rewind ( $fp );
return stream_get_contents ( $fp );
>

echo quoted_printable_encode ( str_repeat ( «hello there » , 50 ). » a=1\r\n» ). «\n» ;
?>

The filter needs to be restricted to STREAM_FILTER_READ because by default it will get filtered both going into and out of the stream, and will thus get encoded twice.

It should be much faster than using a PHP implementation of the same thing, though note that this will only work in PHP 5.1+.

Оцените статью