← Назад к справке

Модули коробки

Диск

Рабочая справка по модулю disk в коробочном Bitrix24: хранилища, папки, объекты, файлы Диска, загрузка файлов и права.

Диск — это не просто запись в b_file. В Bitrix24 файл часто является объектом Диска: у него есть хранилище, папка, права, версии и связи с CRM, задачами или сообщениями.

Общее понимание

Модуль disk нужен для работы с файлами Диска, а не только с физическими файлами.

Что такое Диск

В Диске есть хранилища, папки и файлы. Хранилище может принадлежать пользователю, группе или быть общим. Файл Диска может ссылаться на физический файл в файловом хранилище Битрикса.

Подключение модуля

<?php

use Bitrix\Main\Loader;

Loader::includeModule('disk');
<?php

use Bitrix\Main\Loader;

/**
 * Подключает модуль disk.
 */
function requireDiskModule(): void
{
    if (!Loader::includeModule('disk')) {
        throw new \RuntimeException('Не удалось подключить модуль disk');
    }
}

requireDiskModule();

b_file и Disk

Сущность Что означает
b_file Физический файл в файловой системе Битрикса.
Файл Диска Объект Диска с правами, хранилищем, папкой и связями.
Привязка файла Связь файла Диска с задачей, CRM, сообщением или другой сущностью.

Карта методов

Метод Что делает Когда использовать
Driver::getInstance() Возвращает драйвер Диска. Точка входа для хранилищ и прав.
getStorageByUserId() Получает хранилище пользователя. Файлы конкретного пользователя.
getStorageByGroupId() Получает хранилище группы. Файлы рабочей группы или проекта.
Storage::loadById() Получает хранилище по ID. Когда ID хранилища уже известен.
$storage->getRootObject() Возвращает корневую папку. Поиск и создание файлов в корне.
$folder->getChild() Ищет дочерний объект. Найти папку или файл по имени.
$folder->addSubFolder() Создаёт подпапку. Создать папку внутри папки.
$folder->uploadFile() Загружает файл в папку Диска. Импорт файлов в Диск.
File::loadById() Получает файл Диска. Работа с известным ID объекта файла.
$disk_file->getFileId() Возвращает ID физического файла. Переход от объекта Диска к CFile.
getRightsManager() Возвращает менеджер прав. Проверка и настройка прав Диска.

Хранилища и папки

Работа с Диском обычно начинается с получения хранилища.

Получить хранилище пользователя

<?php

use Bitrix\Main\Loader;
use Bitrix\Disk\Driver;
use Bitrix\Disk\Storage;

Loader::includeModule('disk');

/**
 * Получает хранилище пользователя.
 */
function fetchUserDiskStorage(int $user_id): ?Storage
{
    if ($user_id <= 0) {
        return null;
    }

    return Driver::getInstance()->getStorageByUserId($user_id);
}

$storage = fetchUserDiskStorage($user_id);

if ($storage !== null) {
    echo $storage->getId();
}

Хранилище группы и по ID

<?php

use Bitrix\Main\Loader;
use Bitrix\Disk\Driver;
use Bitrix\Disk\Storage;

Loader::includeModule('disk');

/**
 * Получает хранилище группы.
 */
function fetchGroupDiskStorage(int $group_id): ?Storage
{
    if ($group_id <= 0) {
        return null;
    }

    return Driver::getInstance()->getStorageByGroupId($group_id);
}

/**
 * Получает хранилище по ID.
 */
function fetchDiskStorageById(int $storage_id): ?Storage
{
    if ($storage_id <= 0) {
        return null;
    }

    return Storage::loadById($storage_id);
}

$group_storage = fetchGroupDiskStorage($group_id);
$storage = fetchDiskStorageById($storage_id);

Получить корневую папку

<?php

use Bitrix\Disk\Folder;
use Bitrix\Disk\Storage;

/**
 * Получает корневую папку хранилища.
 */
function fetchStorageRootFolder(Storage $storage): ?Folder
{
    $root_object = $storage->getRootObject();

    return $root_object instanceof Folder ? $root_object : null;
}

$root_folder = fetchStorageRootFolder($storage);

if ($root_folder !== null) {
    echo $root_folder->getName();
}

Найти папку или файл

<?php

use Bitrix\Disk\BaseObject;
use Bitrix\Disk\Folder;
use Bitrix\Disk\Internals\FolderTable;

/**
 * Ищет папку в родительской папке.
 */
function findChildFolder(Folder $parent_folder, string $folder_name): ?Folder
{
    $child = $parent_folder->getChild([
        '=NAME' => $folder_name,
        'TYPE' => FolderTable::TYPE_FOLDER,
    ]);

    return $child instanceof Folder ? $child : null;
}

/**
 * Ищет объект в корневой папке по имени.
 */
function findDiskRootChild(Folder $root_folder, string $name): ?BaseObject
{
    if ($name === '') {
        return null;
    }

    $object = $root_folder->getChild([
        '=NAME' => $name,
    ]);

    return $object instanceof BaseObject ? $object : null;
}

$folder = findChildFolder($root_folder, 'Документы');

if ($folder !== null) {
    echo $folder->getId();
}

Создать папку

<?php

use Bitrix\Disk\Folder;

/**
 * Создаёт подпапку.
 */
function addDiskSubFolder(Folder $parent_folder, string $name, int $created_by_id): ?Folder
{
    if ($name === '' || $created_by_id <= 0) {
        return null;
    }

    $folder = $parent_folder->addSubFolder([
        'NAME' => $name,
        'CREATED_BY' => $created_by_id,
    ]);

    return $folder instanceof Folder ? $folder : null;
}

$folder = addDiskSubFolder($root_folder, 'Документы', $created_by_id);

Файлы

Файл Диска можно получить как объект, а потом перейти к физическому файлу.

Получить файл по ID

<?php

use Bitrix\Main\Loader;
use Bitrix\Disk\File;

Loader::includeModule('disk');

/**
 * Получает файл Диска по ID.
 */
function fetchDiskFileById(int $file_id): ?File
{
    if ($file_id <= 0) {
        return null;
    }

    $file = File::loadById($file_id);

    return $file instanceof File ? $file : null;
}

$disk_file = fetchDiskFileById($file_id);

if ($disk_file !== null) {
    echo $disk_file->getName();
}

Получить физический файл

<?php

use Bitrix\Disk\File;

/**
 * Получает массив физического файла из объекта Диска.
 */
function fetchDiskPhysicalFile(File $disk_file): array
{
    $file_id = (int) $disk_file->getFileId();

    if ($file_id <= 0) {
        return [];
    }

    $file = \CFile::GetFileArray($file_id);

    return is_array($file) ? $file : [];
}

$disk_file = File::loadById($disk_file_id);

if ($disk_file instanceof File) {
    $file = fetchDiskPhysicalFile($disk_file);

    print_r($file);
}

Так можно получить путь, размер, имя и другие данные физического файла через стандартный файловый API.

Загрузить файл в папку

<?php

use Bitrix\Disk\File;
use Bitrix\Disk\Folder;

/**
 * Загружает физический файл в папку Диска.
 */
function uploadFileToDiskFolder(Folder $folder, string $absolute_file_path, int $created_by_id): ?File
{
    if ($absolute_file_path === '' || $created_by_id <= 0 || !file_exists($absolute_file_path)) {
        return null;
    }

    $file_array = \CFile::MakeFileArray($absolute_file_path);

    if (!is_array($file_array)) {
        return null;
    }

    $disk_file = $folder->uploadFile(
        $file_array,
        [
            'CREATED_BY' => $created_by_id,
        ]
    );

    return $disk_file instanceof File ? $disk_file : null;
}

$disk_file = uploadFileToDiskFolder(
    $root_folder,
    $_SERVER['DOCUMENT_ROOT'] . '/upload/example.pdf',
    $created_by_id
);

Права Диска

<?php

use Bitrix\Main\Loader;
use Bitrix\Disk\Driver;

Loader::includeModule('disk');

/**
 * Получает ID права Диска по имени.
 */
function fetchDiskAccessTaskId(string $task_name): int
{
    $rights_manager = Driver::getInstance()->getRightsManager();

    return (int) $rights_manager->getTaskIdByName($task_name);
}

$rights_manager = Driver::getInstance()->getRightsManager();

$read_task_id = fetchDiskAccessTaskId($rights_manager::TASK_READ);
$edit_task_id = fetchDiskAccessTaskId($rights_manager::TASK_EDIT);
$full_task_id = fetchDiskAccessTaskId($rights_manager::TASK_FULL);

print_r([
    'read' => $read_task_id,
    'edit' => $edit_task_id,
    'full' => $full_task_id,
]);

Настройка прав Диска зависит от объекта, хранилища и типа доступа. Перед изменением прав лучше сначала вывести текущие права объекта на тестовой сущности.

Источники