Чтение файла в строку

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

Решение
Функция filesize() вызывается, чтобы получить размер файла, а затем надо указать функции fread() количество байт, которое следует прочитать:

$fh = fopen('people.txt','r') or die($php_errormsg);
$people = fread($fh,filesize('people.txt'));
if (preg_match('/Names:.*(David|Susannah)/i',$people)) {
print "people.txt matches.";
}
fclose($fh) or die($php_errormsg);

Обсуждение
Чтобы прочитать двоичный файл (например, изображение) в Windows, необходимо добавить b к режиму открытия файла:

$fh = fopen('people.jpg','rb') or die($php_errormsg);
$people = fread($fh,filesize('people.jpg'));
fclose($fh);

Есть более короткий путь напечатать все содержимое файла, чем читать его в строку, а затем эту строку печатать. PHP предоставляет для этого две функции. Первая функция, fpassthru($fh), печатает все, что осталось в дескрипторе файла $fh, а затем закрывает его. Вторая функция, readfile($filename), сразу печатает все содержимое $filename.

Функция readfile() позволяет реализовать выборочный показ изображений, в зависимости от некоторого условия.


Следующая программа требует, чтобы запрашиваемые изображения были не старше одной недели:

$image_directory = '/usr/local/images';
if (preg_match('/^[a-zA-Z0-9]+\.(gif|jpeg)$/',$image,$matches) &&
is_readable($image_directory."/$image") &&
(filemtime($image_directory."/$image") >= (time() - 86400 * 7))) {
header('Content-Type: image/'.$matches[1]);
header('Content-Length: '.filesize($image_directory."/$image"));
readfile($image_directory."/$image");
} else {
error_log("Can't serve image: $image");
}

Каталог, в котором хранятся изображения, $image_directory, должен находиться вне коренного каталога для документов веб-сервера, чтобы ваша программа-фильтр была эффективной. В противном случае, пользователь может просто получить непосредственный доступ к файлам изображения. Вы проверяете изображение по трем параметрам.

Во-первых, проверьте, чтобы имя файла, переданное в переменной $image, состояло исключительно из букв и цифр и имело расширение .gif или .jpeg. Необходимо убедиться, что в имени файла нет таких комбинаций символов, как .. или /; это не позволит злонамеренным пользователям получить файлы, находящиеся вне указанного каталога.


Во-вторых, при помощи функции is_readable() убедитесь, что у вас достаточно прав для чтения этого файла. Наконец, вызвав функцию filemtime(), получите время модификации файла и убедитесь, что это время превышает 86400×7 секунд. В дне 86400 секунд, поэтому значение 86400×7 соответствует неделе.1 Если все эти условия выполнены,то изображение готово к отправке. Сначала пошлите два заголовка, чтобы сообщить броузеру MIME-тип изображения и размер файла. Затем, вызвав функцию readfile(), отошлите пользователю все содержимое файла сразу.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Блокировка файла
Выбор случайной строки из файла
Запись в несколько файловых дескрипторов одновременно
Запись в стандартный поток вывода
Непосредственная модификация файла без временной копии

Вернуться в раздел: PHP / 18. Файлы