Работа с файлами
CodeIgniter предоставляет класс File, который оборачивает класс SplFileInfo и предоставляет дополнительные удобные методы. Этот класс является базовым классом для загруженных файлов и изображений.
Получение экземпляра File
Вы создаете новый экземпляр File, передав путь к файлу в конструктор. По умолчанию, файл не обязательно должен существовать. Однако вы можете передать дополнительный аргумент «true», чтобы проверить существование файла и выбросить FileNotFoundException() в случае его отсутствия.
$file = new \CodeIgniter\Files\File($path);
Использование возможностей Spl
После получения экземпляра, у вас есть полный доступ к возможностям класса SplFileInfo, включая:
// Get the file's basename
echo $file->getBasename();
// Get last modified time
echo $file->getMTime();
// Get the true real path
echo $file->getRealPath();
// Get the file permissions
echo $file->getPerms();
// Write CSV rows to it.
if ($file->isWritable()) {
$csv = $file->openFile('w');
foreach ($rows as $row) {
$csv->fputcsv($row);
}
}
Новые возможности
В дополнение ко всем методам класса SplFileInfo, вы получаете новые инструменты.
getRandomName()
Вы можете сгенерировать криптографически безопасное случайное имя файла, добавив текущую метку времени в его начало, используя метод getRandomName(). Это особенно полезно для переименования файлов при перемещении, чтобы имя файла было непредсказуемым:
// Generates something like: 1465965676_385e33f741.jpg $newName = $file->getRandomName();
getSize()
Возвращает размер загруженного файла в байтах:
$size = $file->getSize(); // 256901
getSizeByUnit()
Возвращает размер загруженного файла по умолчанию в байтах. Вы можете передать «kb» или «mb» в качестве первого параметра, чтобы получить результат в килобайтах или мегабайтах соответственно:
$bytes = $file->getSizeByUnit(); // 256901
$kilobytes = $file->getSizeByUnit('kb'); // 250.880
$megabytes = $file->getSizeByUnit('mb'); // 0.245
getMimeType()
Получает тип носителя (mime-тип) файла. Использует методы, которые считаются максимально безопасными при определении типа файла:
$type = $file->getMimeType(); echo $type; // image/png
guessExtension()
Попытка определить расширение файла на основе надёжного getMimeType() метода. Если тип MIME неизвестен, возвращает null. Часто это более надёжный источник, чем просто использование расширения, указанного в имени файла. Использует значения в app/Config/Mimes.php для определения расширения:
// Returns 'jpg' (WITHOUT the period) $ext = $file->guessExtension();
Перемещение файлов
Каждый файл может быть перемещён в новое место с помощью метода move(). В качестве первого параметра передается каталог, в который необходимо переместить файл:
$file->move(WRITEPATH.'uploads');
По умолчанию используется исходное имя файла. Вы можете указать новое имя файла, передав его в качестве второго параметра:
$newName = $file->getRandomName(); $file->move(WRITEPATH.'uploads', $newName);
Метод move() возвращает новый экземпляр File для перемещённого файла, поэтому вам необходимо поймать результат, если требуется конечное местоположение:
$file = $file->move(WRITEPATH.'uploads');
Коллекции файлов
Работа с группами файлов может быть неудобной, поэтому фреймворк предоставляет класс FileCollection, чтобы упростить поиск и работу с группами файлов по всей файловой системе. В самом простом случае FileCollection представляет собой индекс файлов, которые вы задаете или создаете:
$files = new FileCollection([
FCPATH . 'index.php',
ROOTPATH . 'spark',
]);
$files->addDirectory(APPPATH . 'Filters');
После ввода файлов, с которыми вы хотите работать, вы можете удалить файлы или использовать команды фильтрации для удаления или сохранения файлов, соответствующих определенному шаблону regex или glob:
$files->removeFile(APPPATH . 'Filters/DevelopToolbar');
$files->removePattern('#\.gitkeep#');
$files->retainPattern('*.php');
Когда ваша коллекция будет завершена, вы можете использовать get() для получения окончательного списка путей к файлам или воспользоваться тем, что FileCollection является подсчитываемым и итерируемым объектом, чтобы работать напрямую с каждым File:
echo 'My files: ' . implode(PHP_EOL, $files->get());
echo 'I have ' . count($files) . ' files!';
foreach ($files as $file)
{
echo 'Moving ' . $file->getBasename() . ', ' . $file->getSizeByUnit('mb');
$file->move(WRITABLE . $file->getRandomName());
}
Ниже приведены конкретные методы работы с FileCollection.
Начальная инициализация коллекции
__construct(string[] $files = [])
Конструктор принимает необязательный массив путей к файлам, которые будут использоваться в качестве начальной коллекции. Эти пути передаются в метод add(), поэтому любые файлы, предоставленные дочерними классами в $files, сохранятся.
define()
Позволяет дочерним классам определять свои собственные начальные файлы. Этот метод вызывается конструктором и позволяет предварительно определять коллекции без необходимости использования их методов. Пример:
class ConfigCollection extends \CodeIgniter\Files\FileCollection
{
protected function define(): void
{
$this->add(APPPATH . 'Config', true)->retainPattern('*.php');
}
}
Теперь вы можете использовать ConfigCollection в любом месте вашего проекта, чтобы получить доступ ко всем файлам конфигурации приложения, без необходимости повторного вызова методов коллекции каждый раз.
set(array $files)
Устанавливает список входных файлов, предоставленных в виде массива путей к файлам. Это удалит все существующие файлы из коллекции, поэтому $collection->set([]) по сути является сбросом.
Ввод файлов
add(string[]|string $paths, bool $recursive = true)
Добавляет все файлы, указанные путем или массивом путей. Если путь указывает на каталог, то $recursive будет включать подкаталоги.
addFile(string $file) addFiles(array $files)
Добавляет файл или файлы в текущий список входных файлов. Файлы - это абсолютные пути к реальным файлам.
removeFile(string $file) removeFiles(array $files)
Удаляет файл или файлы из текущего списка входных файлов.
addDirectory(string $directory, bool $recursive = false) addDirectories(array $directories, bool $recursive = false)
Добавляет все файлы из каталога или каталогов, при необходимости рекурсивно заходя в подкаталоги. Каталоги - это абсолютные пути к реальным каталогам.
Фильтрация файлов
removePattern(string $pattern, string $scope = null) retainPattern(string $pattern, string $scope = null)
Фильтрует текущий список файлов по шаблону (и необязательному scope), удаляя или сохраняя соответствующие файлы. $pattern может быть полным выражением регулярного выражения (например, '#[A-Za-z]+\.php#') или псевдо-выражением регулярного выражения, похожим на glob() (например, *.css). Если предоставлен $scope, то будут учитываться только файлы в этом каталоге или подкаталогах (т.е. файлы вне $scope всегда сохраняются). Если scope не предоставлен, то все файлы подлежат фильтрации.
Примеры:
$files = new FileCollection();
$files->add(APPPATH . 'Config', true); // Adds all Config files and directories
$files->removePattern('*tion.php'); // Would remove Encryption.php, Validation.php, and boot/production.php
$files->removePattern('*tion.php', APPPATH . 'Config/boot'); // Would only remove boot/production.php
$files->retainPattern('#A.+php$#'); // Would keep only Autoload.php
$files->retainPattern('#d.+php$#', APPPATH . 'Config/boot'); // Would keep everything but boot/production.php and boot/testing.php
Получение файлов
get(): string[]
Возвращает массив всех загруженных входных файлов.
Примечание
FileCollection является IteratorAggregate, поэтому вы можете работать с ним напрямую (например, foreach ($collection as $file)).
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/libraries/files.html