• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_disk.php
  • Класс: CIMDisk
  • Вызов: CIMDisk::SaveFromLocalDisk
static function SaveFromLocalDisk($chatId, $fileId, bool $symlink = false, ?int $userId = null)
{
	if (!self::Enabled())
	{
		return false;
	}

	if ((int)$fileId <= 0 || (int)$chatId <= 0)
	{
		return false;
	}

	$fileModel = BitrixDiskFile::getById($fileId, array('STORAGE'));
	if (!$fileModel)
	{
		return false;
	}
	if ($fileModel instanceof BitrixDiskFileLink)
	{
		$fileModel = $fileModel->getRealObject();
		if (!$fileModel)
		{
			return false;
		}
	}

	$storageModel = $fileModel->getStorage();
	if (!$storageModel)
	{
		return false;
	}

	$securityContext = null;
	if (is_null($userId))
	{
		$securityContext = $storageModel->getCurrentUserSecurityContext();
	}
	else if ($userId > 0)
	{
		$securityContext = $storageModel->getSecurityContext($userId);
	}

	if ($securityContext && !$fileModel->canRead($securityContext))
	{
		return false;
	}

	$folderModel = self::GetFolderModel($chatId);
	if (!$folderModel)
	{
		return false;
	}

	if ($symlink)
	{
		$accessProvider = new BitrixImAccessChatAuthProvider;
		$rightsManager = BitrixDiskDriver::getInstance()->getRightsManager();

		$rightsManager->append(
			$fileModel,
			[[
				// allow reading for access code `CHATxxx`
				'ACCESS_CODE' => $accessProvider->generateAccessCode($chatId),
				'TASK_ID' => $rightsManager->getTaskIdByName($rightsManager::TASK_READ)
			]]
		);

		$newFileModel = $folderModel->addFileLink(
			$fileModel,
			[
				'CREATED_BY' => (int)$userId,
				'GLOBAL_CONTENT_VERSION' => 1
			],
			[],// link inherits access rights from parent folder
			true
		);
	}
	else
	{
		$newFileModel = $fileModel->copyTo($folderModel, (int)$userId, true);
	}

	if (!$newFileModel)
	{
		return false;
	}

	$newFileModel->increaseGlobalContentVersion();

	return $newFileModel;
}