appConfig->getPreview()) { return false; } if (!$file || $file->getSize() === 0 || $file->getSize() > $this->appConfig->getLimitThumbSize()) { return false; } if (!in_array($file->getMimetype(), self::$capabilities, true)) { return false; } return !$file->getStorage()->instanceOfStorage(SharingExternalStorage::class); } /** * {@inheritDoc} */ public function getThumbnail(File $file, int $maxX, int $maxY): ?IImage { $this->logger->debug("getThumbnail {$file->getId()} $maxX $maxY"); [$fileUrl, $extension, $key] = $this->getFileParam($file); if ($fileUrl === null || $extension === null || $key === null) { return null; } $imageUrl = null; try { $imageUrl = $this->documentService->getConvertedUri($fileUrl, $extension, self::THUMBEXTENSION, $key); } catch (\Exception $e) { $this->logger->error("getConvertedUri: from $extension to " . self::THUMBEXTENSION, ["exception" => $e]); return null; } try { $thumbnail = $this->documentService->request($imageUrl); } catch (\Exception $e) { $this->logger->error("Failed to download thumbnail", ["exception" => $e]); return null; } $image = new Image(); $image->loadFromData($thumbnail); if ($image->valid()) { $image->scaleDownToFit($maxX, $maxY); return $image; } return null; } /** * Generate secure link to download document * * @param File $file - file * @param IUser $user - user with access * @param int $version - file version * @param bool $template - file is template */ private function getUrl(File $file, ?IUser $user, int $version = 0, bool $template = false): string { $data = [ "action" => "download", "fileId" => $file->getId() ]; $userId = null; if ($user instanceof IUser) { $userId = $user->getUID(); $data["userId"] = $userId; } if ($version > 0) { $data["version"] = $version; } if ($template) { $data["template"] = true; } $hashUrl = $this->crypt->getHash($data); $fileUrl = $this->urlGenerator->linkToRouteAbsolute($this->appName . ".callback.download", ["doc" => $hashUrl]); if (!$this->appConfig->useDemo() && !empty($this->appConfig->getStorageUrl())) { $fileUrl = str_replace($this->urlGenerator->getAbsoluteURL("/"), $this->appConfig->getStorageUrl(), $fileUrl); } return $fileUrl; } /** * Generate array with file parameters * * @param File $file - file */ private function getFileParam(File $file): array { if ($file->getType() !== FileInfo::TYPE_FILE || $file->getSize() === 0) { return [null, null, null]; } $owner = $file->getOwner(); $key = null; $versionNum = 0; $template = false; if (FileVersions::splitPathVersion($file->getPath()) !== false) { if ($this->versionManager === null || $owner === null) { return [null, null, null]; } $versionFolder = new View("/" . $owner->getUID() . "/files_versions"); $absolutePath = $file->getPath(); $relativePath = $versionFolder->getRelativePath($absolutePath); [$filePath, $fileVersion] = FileVersions::splitPathVersion($relativePath); if ($filePath === null) { return [null, null, null]; } $file = $this->root->getUserFolder($owner->getUID())->get($filePath); $versions = FileVersions::processVersionsArray($this->versionManager->getVersionsForFile($owner, $file)); foreach ($versions as $version) { $versionNum += 1; $versionId = $version->getRevisionId(); if (strcmp((string) $versionId, (string) $fileVersion) === 0) { $key = $this->fileUtility->getVersionKey($version); $key = DocumentService::generateRevisionId($key); break; } } } else { $key = $this->fileUtility->getKey($file); $key = DocumentService::generateRevisionId($key); } if (TemplateManager::isTemplate($file->getId())) { $template = true; } $fileUrl = $this->getUrl($file, $owner, $versionNum, $template); $fileExtension = $file->getExtension(); return [$fileUrl, $fileExtension, "thumb_$key"]; } }