![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/cartforge.co/vendor/magento/module-catalog/Model/Category/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Catalog\Model\Category; use Magento\Catalog\Model\Category\Media\PathResolverFactory; use Magento\Catalog\Model\Category\Media\PathResolverInterface; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\File\Mime; use Magento\Framework\Filesystem; use Magento\Framework\Filesystem\Directory\WriteInterface; use Magento\Framework\Filesystem\Directory\ReadInterface; use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\Filesystem\ExtendedDriverInterface; use Magento\Store\Model\StoreManagerInterface; /** * Class FileInfo * * Provides information about requested file */ class FileInfo { /** * Path in /pub/media directory */ public const ENTITY_MEDIA_PATH = '/catalog/category'; /** * @var Filesystem */ private $filesystem; /** * @var Mime */ private $mime; /** * @var WriteInterface */ private $mediaDirectory; /** * @var ReadInterface */ private $baseDirectory; /** * @var ReadInterface */ private $pubDirectory; /** * @var \Magento\Store\Model\StoreManagerInterface */ private $storeManager; /** * @param Filesystem $filesystem * @param Mime $mime * @param StoreManagerInterface $storeManager */ public function __construct( Filesystem $filesystem, Mime $mime, StoreManagerInterface $storeManager ) { $this->filesystem = $filesystem; $this->mime = $mime; $this->storeManager = $storeManager; } /** * Get WriteInterface instance * * @return WriteInterface */ private function getMediaDirectory() { if ($this->mediaDirectory === null) { $this->mediaDirectory = $this->filesystem->getDirectoryWrite(DirectoryList::MEDIA); } return $this->mediaDirectory; } /** * Get Base Directory read instance * * @return ReadInterface */ private function getBaseDirectory() { if (!isset($this->baseDirectory)) { $this->baseDirectory = $this->filesystem->getDirectoryRead(DirectoryList::ROOT); } return $this->baseDirectory; } /** * Get Pub Directory read instance * * @return ReadInterface */ private function getPubDirectory() { if (!isset($this->pubDirectory)) { $this->pubDirectory = $this->filesystem->getDirectoryRead(DirectoryList::PUB); } return $this->pubDirectory; } /** * Retrieve MIME type of requested file * * @param string $fileName * @return string */ public function getMimeType($fileName) { if ($this->getMediaDirectory()->getDriver() instanceof ExtendedDriverInterface) { return $this->mediaDirectory->getDriver()->getMetadata($fileName)['mimetype']; } else { return $this->mime->getMimeType( $this->getMediaDirectory()->getAbsolutePath( $this->getFilePath($fileName) ) ); } } /** * Get file statistics data * * @param string $fileName * @return array */ public function getStat($fileName) { $filePath = $this->getFilePath($fileName); $result = $this->getMediaDirectory()->stat($filePath); return $result; } /** * Check if the file exists * * @param string $fileName * @return bool */ public function isExist($fileName) { $filePath = $this->getFilePath($fileName); $result = $this->getMediaDirectory()->isExist($filePath); return $result; } /** * Construct and return file subpath based on filename relative to media directory * * @param string $fileName * @return string */ private function getFilePath($fileName) { $filePath = $this->removeStorePath($fileName); $filePath = ltrim($filePath, '/'); $mediaDirectoryRelativeSubpath = $this->getMediaDirectoryPathRelativeToBaseDirectoryPath($filePath); $isFileNameBeginsWithMediaDirectoryPath = $this->isBeginsWithMediaDirectoryPath($fileName); // if the file is not using a relative path, it resides in the catalog/category media directory $fileIsInCategoryMediaDir = !$isFileNameBeginsWithMediaDirectoryPath; if ($fileIsInCategoryMediaDir) { $filePath = self::ENTITY_MEDIA_PATH . '/' . $filePath; } else { $filePath = substr($filePath, strlen($mediaDirectoryRelativeSubpath)); } return $filePath; } /** * Checks for whether $fileName string begins with media directory path * * @param string $fileName * @return bool */ public function isBeginsWithMediaDirectoryPath($fileName) { $filePath = $this->removeStorePath($fileName); $filePath = ltrim($filePath, '/'); $mediaDirectoryRelativeSubpath = $this->getMediaDirectoryPathRelativeToBaseDirectoryPath($filePath); $isFileNameBeginsWithMediaDirectoryPath = strpos($filePath, (string) $mediaDirectoryRelativeSubpath) === 0; return $isFileNameBeginsWithMediaDirectoryPath; } /** * Clean store path in case if it's exists * * @param string $path * @return string */ private function removeStorePath(string $path): string { $result = $path; try { $storeUrl = $this->storeManager->getStore()->getBaseUrl() ?? ''; } catch (NoSuchEntityException $e) { return $result; } // phpcs:ignore Magento2.Functions.DiscouragedFunction $path = parse_url($path, PHP_URL_PATH); // phpcs:ignore Magento2.Functions.DiscouragedFunction $storePath = parse_url($storeUrl, PHP_URL_PATH); $storePath = rtrim($storePath, '/'); $result = preg_replace('/^' . preg_quote($storePath, '/') . '/', '', $path); return $result; } /** * Get media directory subpath relative to base directory path * * @param string $filePath * @return string */ private function getMediaDirectoryPathRelativeToBaseDirectoryPath(string $filePath = '') { $baseDirectory = $this->getBaseDirectory(); $baseDirectoryPath = $baseDirectory->getAbsolutePath(); $mediaDirectoryPath = $this->getMediaDirectory()->getAbsolutePath(); $pubDirectoryPath = $this->getPubDirectory()->getAbsolutePath(); $mediaDirectoryRelativeSubpath = substr($mediaDirectoryPath, strlen($baseDirectoryPath)); $pubDirectory = $baseDirectory->getRelativePath($pubDirectoryPath); if ($pubDirectory && strpos($mediaDirectoryRelativeSubpath, $pubDirectory) === 0 && strpos($filePath, $pubDirectory) !== 0) { $mediaDirectoryRelativeSubpath = substr($mediaDirectoryRelativeSubpath, strlen($pubDirectory)); } return $mediaDirectoryRelativeSubpath; } /** * Get file relative path to media directory * * @param string $filename * @return string */ public function getRelativePathToMediaDirectory(string $filename): string { return $this->getFilePath($filename); } }