new: Мой ФэшнБлог

Диск - api коробка

документация Битрикса https://dev.1c-bitrix.ru/api_d7/bitrix/disk/index.php
CModule::IncludeModule('disk'); //диск
\Bitrix\Main\Loader::includeModule('disk');
Посмотреть данные о диске тут:  
Настройки - Производительность - Таблицы - b_disk_storage
работа с файлом диска
$file = Bitrix\Disk\File::getById($fileId); //получить файл

$name = $file->getName(); // получим имя файла
$info = $file->getFile(); // получим информацию о файле

ptint_r($info);
//$info["CONTENT_TYPE"] - тип файла
//$info["SRC"] - путь файла


$link = \Bitrix\Disk\Driver::getInstance()->getUrlManager()->getUrlForShowFile($file); // получим ссылку на файл в Диске

$file->delete($userId); //удалить из-под пользователя 
когда файл в поле
$sSrc = CFile::GetPath($fileId); //путь к файлу
$sFullSrc = $_SERVER['DOCUMENT_ROOT'].$sSrc; //полный путь к файлу

удалить диск
$userId = 1; //id пользователя, от имени которого будет совершаться удаление
$storageId = 100; //id хранилища Диска, которые вы желаете удалить. См. таблицу b_disk_storage
$errors = null;
$storage = \Bitrix\Disk\Storage::loadById($storageId);
if($storage){
    if(!$storage->delete($userId)){
        $errors = $storage->getErrors();
    }
}
переименовать диск
$storageId = 100; //id хранилища Диска, которые вы желаете переименовать. См. таблицу b_disk_storage
$newName = 'NewName'; //новое имя
$errors = null;

$storage = \Bitrix\Disk\Storage::loadById($storageId);
if($storage){
    if(!$storage->rename($newName)){
        $errors = $storage->getErrors();
    }
}
ограничить размер
Важно!
Должна быть активна настройка «Разрешить квотирование хранилищ»
Настройки > Настройки продукта > Настройки модулей > Диск
$userId = 1; //кому

$storage = \Bitrix\Disk\Driver::getInstance()->getStorageByUserId($userId);
//установить лимит в 1024*1024 байт
$storage->setSizeLimit(1024*1024);

//отключить лимит 
$storage->setSizeLimit(null);
получить путь
$fileId = 100;

$file = \Bitrix\Disk\File::getById($fileId);
$urlManager = \Bitrix\Disk\Driver::getInstance()->getUrlManager();

var_dump($urlManager->getPathFileDetail($file));
var_dump($urlManager->getPathInListing($file));
изменение прав на папку диска
CModule::IncludeModule('disk');

$storage = \Bitrix\Disk\Driver::getInstance()->getStorageByUserId(1);
$folder = \Bitrix\Disk\Folder::load(array(
   'PARENT_ID' => $storage->getRootObjectId(),
   'NAME' => 'Загруженные файлы',
   'STORAGE_ID' => $storage->getId()
));
if($folder){
   $newRights = array(
      Array(
         "ACCESS_CODE" => "U1", // Пользователь ID=1
         "TASK_ID" => "81"
      ),
     Array(
         "ACCESS_CODE" => "G1", // Группа пользователей ID=1
         "TASK_ID" => "81"
     ),
     Array(
        "ACCESS_CODE" => "AU", // Все авторизованные пользователи
        "TASK_ID" => 78
     ),
     Array(
        "ACCESS_CODE" => "G2", // Все пользователи
        "TASK_ID" => 78
     )
   );

   $rightsManager = \Bitrix\Disk\Driver::getInstance()->getRightsManager();
   $rightsManager->append($folder->getRealObject(), $newRights);
}
по внутренеей ссылке получить файл: у битрикса разные внутренние ссылки
тут пример. как работать с 4мя типами
получить файл по названию папки и названию файла
if (\Bitrix\Main\Loader::includeModule('disk')){ 
      
   $storage = \Bitrix\Disk\Driver::getInstance()->getStorageByUserId(1); 
   if ($storage) 
   { 
      $root_folder = $storage->getRootObject(); 
      $targer_folder = $root_folder->getChild( 
         array( 
            '=NAME' => 'Загруженные файлы',  
            'TYPE' => \Bitrix\Disk\Internals\FolderTable::TYPE_FOLDER 
         ) 
      );
      $file = $targer_folder->getChild( 
         array( 
            '=NAME' => 'test.docx',  
            'TYPE' => \Bitrix\Disk\Internals\FileTable::TYPE_FILE 
         ) 
      ); 
      if ($file) 
      { 
         print_r($file);
      } 
   } 
}
получить диск по BASE_URL
$disks = \Bitrix\Disk\Storage::getList([
    "select"=>["ID","ENTITY_MISC_DATA"],
    "filter"=> [
               "ENTITY_TYPE"=>"Bitrix\Disk\ProxyType\Common",
               "ENTITY_MISC_DATA" => "%".$code."%"
     ]
]);
if($disk = $disks->fetch()){
  //
}

ОБРАБОТЧИКИ
обработчик, который при изменении пользователя диск ограничивает
AddEventHandler("main", "OnAfterUserUpdate", "SetMaxFileSizeDisk"); 
function SetMaxFileSizeDisk($arFields){ 
   $userId = $arFields["ID"]; 
   if(CModule::IncludeModule('disk')){ 
      $storage = \Bitrix\Disk\Driver::getInstance()->getStorageByUserId($userId); 
      $storage->setSizeLimit(1073741824); //1гб = 1073741824байт 
   } 
}
Задача: ограничить размер файла передаваемого в чате корпоративного портала
Решение: обработчик, который удаляет файлы в чате более 10мб
в init.php
AddEventHandler("im", "OnAfterFileUpload", "CheckFileSize");
function CheckFileSize($arFields){   
   if(!empty($arFields["FILE"]["size"]) && ($arFields["FILE"]["size"]>10485760) && CModule::IncludeModule("disk")){ //10мб
      $file = Bitrix\Disk\File::getById($arFields["FILE_ID"]);      
      if($file->delete(1)&&CModule::IncludeModule('im')){         
         CIMMessenger::Update($arFields["MESSAGE_ID"], 'Не удалось загрузить файл. Превышен размер в 10мб.');
      }

   }
}
Задача: из результата задачи получить на каждый прикрепленный файл публичную ссылку.
CModule::IncludeModule('forum');
CModule::IncludeModule('tasks');
CModule::IncludeModule('disk');
$rsTask = CTasks::GetByID(216679);
$arTask = $rsTask->GetNext();

$forumTopicId = $arTask['FORUM_TOPIC_ID'];
$arFilesIds = array();

if (
   ($forumId = CTasksTools::GetForumIdForIntranet())
    && ($forumId >= 1)
)
{
    $rc = CForumMessage::GetListEx(
        array(),
        array('FORUM_ID' => $forumId, 'TOPIC_ID' => $forumTopicId)
    );

    $arMessagesIds = array();
    while ($arMsg = $rc->fetch())
    {
        if ($arMsg['SERVICE_DATA']=='TASK_RESULT'){
            $arMessagesIds[] = (int) $arMsg['ID'];}
    }

    foreach ($arMessagesIds as $msgId)
    {
        $arUF = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields("FORUM_MESSAGE", $msgId, LANGUAGE_ID, 1);

        if (isset($arUF['UF_FORUM_MESSAGE_DOC'], $arUF['UF_FORUM_MESSAGE_DOC']['VALUE']))
        {
            if (is_array($arUF['UF_FORUM_MESSAGE_DOC']['VALUE']))
                $arFilesIds = array_merge($arFilesIds, $arUF['UF_FORUM_MESSAGE_DOC']['VALUE']);
        }
    }
}

$arFilesIds = array_unique(array_map('intval', $arFilesIds));

foreach ($arFilesIds as $attachId){
    $attachedObject = \Bitrix\Disk\AttachedObject::getById($attachId, array('OBJECT'));
    if ($attachedObject && $attachedObject->getFile())
    {
        $file = Bitrix\Disk\File::getById($attachedObject->getFile()->getId());
        $result[$attachId] = $file->getFile();
    }
}
print_r($result);


публичная ссылка вида http://адрес_сайта/~JW311
use \Bitrix\Main,   
   \Bitrix\Disk;


$url = '';
$attachId = 1; //Disk attached object id

$authorId = 1; //ИД автора ссылки

try
{
   if (!Main\Loader::IncludeModule('disk')){
      throw new \Exception("Disk module not included");
   }


   $attachObject = Disk\AttachedObject::loadById($attachId); // тип Disk\AttachedObject
   if (!($attachObject instanceof Disk\AttachedObject ) ){
      throw new \Exception("Attached object not loaded");
   }

  
   $diskObject = $attachObject->getObject(); // тип Disk\File
   if (!($diskObject instanceof Disk\File )){
      throw new \Exception("Disk object not loaded");
   }

   $extLinks = $diskObject->getExternalLinks([
      'filter' => [
         'OBJECT_ID' => $diskObject->getId(),
         'CREATED_BY' => $authorId,
         'TYPE' => Disk\ExternalLink::TYPE_MANUAL,
         '=IS_EXPIRED' => false,
      ],
      'limit' => 1,
   ]);

   $extLink = array_pop($extLinks);

   if ( !$extLink ){
      $extLink = $diskObject->addExternalLink([
         'CREATED_BY' => $authorId,
         'TYPE' => Disk\ExternalLink::TYPE_MANUAL,
      ]);
   }

   if (!$extLink){
      throw new \Exception("Can't create or find external link");   
   }

   $url = new Main\Web\Uri(
      Disk\Driver::getInstance()->getUrlManager()->getShortUrlExternalLink(
         [
            'hash' => $extLink->getHash(),
            'action' => 'default',
         ],
         true
      )
   );
}
catch ( \Exception $e){
   var_dump($e->getMessage());
}

/**
 * $url - instance of Bitrix\Main\Web\Uri object
 * if use strVal($url) - return absolute path, e.g. https://**.ru/~KpyTY
 * string(56) "/bitrix/tools/disk/uf.php?attachedId=1&action=show&ncc=1"
 */

echo "<pre>";
var_dump($url); 
echo "</pre>";