Spec-Zone.ru › CodeIgniter 4

Работа с файлами

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

  • Получение экземпляра File
  • Использование возможностей Spl
  • Новые возможности
    • Перемещение файлов

Получение экземпляра 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API