33 private const QUICK_ACCESS_SCOPE_PREFIX =
'chat_';
35 private const ANIMATED_IMAGE_EXTENSIONS = [
'gif',
'webp'];
89 return preg_replace(
"/\[DISK\=([0-9]+)\]/i",
'',
$text);
94 return self::QUICK_ACCESS_SCOPE_PREFIX .
$chatId;
107 if (!$this->diskFile instanceof
File)
117 if ($this->diskFileId)
144 $fileType = (int)
$diskFile->getTypeFile();
146 if ($fileType === TypeFile::IMAGE || $fileType === TypeFile::VIDEO)
160 $userId = $this->getContext()->getUserId();
163 if ($diskFile ===
null)
170 if (!$copy instanceof
File)
180 if (!Loader::includeModule(
'disk'))
185 $folder = $chat->getOrCreateDiskFolder();
188 if (!($folder instanceof Folder) ||
$diskFile ===
null)
193 $newFileModel =
$diskFile->copyTo($folder, $chat->getContext()->getUserId(),
true);
195 if (!($newFileModel instanceof
File))
205 $newFileModel->increaseGlobalContentVersion();
207 return new static($newFileModel, $chat->getId());
217 Message::loadPhrases();
226 .
"\n" . Loc::getMessage(
'IM_MESSAGE_FILE_DOWN')
227 .
' ' . $this->getDownloadLink()
238 'date' => $diskFile?->getCreateTime()?->format(
'c'),
240 'name' => $diskFile?->getName(),
241 'extension' => mb_strtolower(
$diskFile?->getExtension() ??
''),
243 'image' => $this->getPreviewSizes() ??
false,
244 'status' =>
$diskFile?->getGlobalContentVersion() > 1?
'done':
'upload',
245 'progress' =>
$diskFile?->getGlobalContentVersion() > 1? 100: -1,
246 'authorId' => (int)
$diskFile?->getCreatedBy(),
247 'authorName' => $author->getName(),
248 'urlPreview' => $this->getPreviewLink(),
249 'urlShow' => $this->getShowLink(),
250 'urlDownload' => $this->getDownloadLink(),
251 'viewerAttrs' => $this->getViewerAttributes(),
252 'mediaUrl' => $this->getMediaUrl(),
256 private function getMediaUrl():
array
260 250 => $this->getPreviewLinkBySize(250,
true),
272 if (isset($this->contentType))
282 $diskTypeFile = $this->
getDiskFile()->getTypeFile();
284 switch ($diskTypeFile)
286 case TypeFile::IMAGE:
288 case TypeFile::VIDEO:
290 case TypeFile::AUDIO:
304 private function getPreviewSizes(): ?
array
306 $previewParameters = [];
311 $previewParameters =
$diskFile->getFile();
313 if (TypeFile::isVideo(
$diskFile->getName()))
315 $previewParameters =
$diskFile->getView()->getPreviewData();
318 if (empty($previewParameters))
324 'height' => (int)$previewParameters[
'HEIGHT'],
325 'width' => (
int)$previewParameters[
'WIDTH'],
329 private function getPreviewLink(): string
339 $this->isAnimatedImage() => $this->getDownloadLink(),
340 TypeFile::isImage(
$diskFile) => $this->isOversized() ? $this->getShowLink() : $this->getDownloadLink(),
341 $diskFile->getView()->getPreviewData() !== null => $this->getFilePreviewLink(),
346 private function isOversized(?
int $maxSize =
null): bool
348 $maxSize ??= self::MAX_PREVIEW_IMAGE_SIZE;
350 $fileData = $this->
getDiskFile()?->getFile() ?? [];
351 $sourceImageWidth = $fileData[
'WIDTH'] ?? 0;
352 $sourceImageHeight = $fileData[
'HEIGHT'] ?? 0;
354 return $sourceImageHeight > $maxSize || $sourceImageWidth > $maxSize;
357 private function getPreviewLinkBySize(
int $size,
bool $exact =
false): string
365 $previewData =
$diskFile->getView()->getPreviewData();
369 $this->isAnimatedImage() , $previewData !==
null => $this->getFilePreviewLink($size, $exact),
370 TypeFile::isImage(
$diskFile) => $this->isOversized($size)
371 ? $this->getShowLink($size, $exact)
372 : $this->getDownloadLink()
378 private function getShowLink(?
int $size = self::MAX_PREVIEW_IMAGE_SIZE, $exact =
false): string
382 return $this->getLink(
new FileLinkConfig(
'disk.api.file.showImage', $size, $exact));
385 return $this->getDownloadLink();
388 private function getDownloadLink(): string
390 return $this->getLink(
new FileLinkConfig(
'disk.api.file.download'));
393 private function getFilePreviewLink(?
int $size = self::MAX_PREVIEW_IMAGE_SIZE, $exact =
false): string
395 $linkConfig =
new FileLinkConfig(
'disk.api.file.showPreview', $size, $exact,
'preview.jpg');
397 return $this->getLink($linkConfig);
400 private function getLink(FileLinkConfig $linkConfig): string
408 $params = $this->getLinkParams($linkConfig);
409 $urlManager = UrlManager::getInstance();
414 private function getLinkParams(FileLinkConfig $linkConfig):
array
427 $size = $linkConfig->size;
432 $params[
'signature'] = ParameterSigner::getImageSignature(
$diskFile->getId(), $size, $size);
435 $params[
'exact'] = $linkConfig->exact ?
'Y' :
'N';
437 $quickAccessToken = $this->getQuickAccessToken();
438 if ($quickAccessToken !==
null)
440 $params[
'_esd'] = $quickAccessToken;
451 private function isAnimatedImage(): bool
453 return in_array($this->
getDiskFile()?->getExtension(), self::ANIMATED_IMAGE_EXTENSIONS,
true);
456 private function getQuickAccessSupportedFileTypes():
array
458 return [TypeFile::IMAGE, TypeFile::VIDEO];
461 private function isQuickAccessSupported(): bool
465 $supportedTypes = $this->getQuickAccessSupportedFileTypes();
467 return in_array($diskFileType, $supportedTypes,
true);
470 private function getQuickAccessToken(): ?string
477 || !$this->isQuickAccessSupported()
478 || !ServiceLocator::getInstance()->
has(
'disk.scopeTokenService')
485 $scopeTokenService = ServiceLocator::getInstance()->get(
'disk.scopeTokenService');
487 return $scopeTokenService?->getEncryptedScopeForObject($file, $scope);
491 private function getViewerAttributes(): ?
array
497 if ($fileData && $fileData[
'CONTENT_TYPE'] ===
'application/octet-stream' &&
GetFileExtension(
$diskFile->getName()) ===
'board')
499 $fileData[
'CONTENT_TYPE'] =
'application/board';
502 $viewerType = FileAttributes::buildByFileData($fileData, $this->getDownloadLink())
505 ->setAttribute(
'data-im-chat-id', $this->
getChatId())
508 'type' =>
'download',
511 'type' =>
'copyToMe',
512 'text' => Loc::getMessage(
'IM_FILE_ITEM_ACTION_SAVE_TO_OWN_FILES'),
513 'action' =>
'BXIM.disk.saveToDiskAction',
517 'extension' =>
'disk.viewer.actions',
518 'buttonIconClass' =>
'ui-btn-icon-cloud',
522 if ($viewerType->getTypeClass() === FileAttributes::JS_TYPE_CLASS_ONLYOFFICE)
524 $viewerType->setTypeClass(
'BX.Messenger.Integration.Viewer.OnlyOfficeChatItem');
526 $diskFile->getCode() === CreateDocumentByCallTemplateScenario::CODE_RESUME
527 ||
$diskFile->getRealObject()->getCode() === CreateDocumentByCallTemplateScenario::CODE_RESUME
530 $viewerType->setTypeClass(
'BX.Messenger.Integration.Viewer.OnlyOfficeResumeItem');
533 $viewerType->setExtension(
'im.integration.viewer');
536 if ($viewerType->getViewerType() === Board::JS_TYPE_BOARD && Configuration::isBoardsEnabled())
538 $uri = Driver::getInstance()->getUrlManager()->getUrlForViewBoard(
$diskFile->getId(),
false,
'chat');
539 $viewerType->addAction([
541 'buttonIconClass' =>
' ',
542 'action' =>
'BX.Disk.Viewer.Actions.openInNewTab',
549 if ($viewerType->getViewerType() !== \Bitrix\Main\UI\Viewer\Renderer\Renderer::JS_TYPE_UNKNOWN)
551 return $viewerType->toDataSet();
554 catch (\Bitrix\Main\ArgumentException $exception)
if(file_exists($_SERVER['DOCUMENT_ROOT'] . "/urlrewrite.php")) $uri
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)