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://адрес_сайта/~JW311use \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>"; |