Files

233 lines
6.8 KiB
PHP
Executable File

<?php
declare(strict_types=1);
namespace MauticPlugin\GrapesJsBuilderBundle\Helper;
use Mautic\CoreBundle\Exception\FileUploadException;
use Mautic\CoreBundle\Helper\CoreParametersHelper;
use Mautic\CoreBundle\Helper\FileUploader;
use Mautic\CoreBundle\Helper\PathsHelper;
use Symfony\Component\Filesystem\Exception\IOException;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Finder\SplFileInfo;
class FileManager
{
public const GRAPESJS_IMAGES_DIRECTORY = '';
public function __construct(
private FileUploader $fileUploader,
private CoreParametersHelper $coreParametersHelper,
private PathsHelper $pathsHelper,
) {
}
/**
* @return array
*
* @throws FileUploadException
*/
public function uploadFiles($request)
{
if (isset($request->files->all()['files'])) {
$files = $request->files->all()['files'];
$uploadDir = $this->getUploadDir();
$uploadedFiles = [];
foreach ($files as $file) {
$this->fileUploader->validateImage($file);
}
foreach ($files as $file) {
$uploadedFiles[] = $this->getFullUrl($this->fileUploader->upload($uploadDir, $file));
}
}
return $uploadedFiles;
}
/**
* @param string $fileName
*/
public function deleteFile($fileName): void
{
$this->fileUploader->delete($this->getCompleteFilePath($fileName));
}
/**
* @param string $fileName
*/
public function getCompleteFilePath($fileName): string
{
$uploadDir = $this->getUploadDir();
return $uploadDir.$fileName;
}
private function getUploadDir(): string
{
return $this->getGrapesJsImagesPath(true);
}
public function getFullUrl($fileName, $separator = '/'): string
{
// if a static_url (CDN) is configured use that, otherwise use the site url
$url = $this->coreParametersHelper->get('static_url') ?? $this->coreParametersHelper->get('site_url');
return $url
.$separator
.$this->getGrapesJsImagesPath(false, $separator)
.$fileName;
}
/**
* @param bool $fullPath
* @param string $separator
*/
private function getGrapesJsImagesPath($fullPath = false, $separator = '/'): string
{
return $this->pathsHelper->getSystemPath('images', $fullPath)
.$separator
.self::GRAPESJS_IMAGES_DIRECTORY;
}
/**
* @deprecated since Mautic 5.2, to be removed in 6.0. Use FileManager::getMediaFiles instead
*/
public function getImages(): array
{
$files = [];
$uploadDir = $this->getUploadDir();
$fileSystem = new Filesystem();
if (!$fileSystem->exists($uploadDir)) {
try {
$fileSystem->mkdir($uploadDir);
} catch (IOException) {
return $files;
}
}
$finder = new Finder();
$finder->files()->in($uploadDir);
foreach ($finder as $file) {
// exclude certain folders from grapesjs file manager
if (in_array($file->getRelativePath(), $this->coreParametersHelper->get('image_path_exclude'))) {
continue;
}
if ($size = @getimagesize($this->getCompleteFilePath($file->getRelativePathname()))) {
$files[] = [
'src' => $this->getFullUrl($file->getRelativePathname()),
'width' => $size[0],
'type' => 'image',
'height' => $size[1],
];
} else {
$files[] = $this->getFullUrl($file->getRelativePathname());
}
}
return $files;
}
/**
* @return array<string, mixed>
*/
public function getMediaFiles(int $page, int $limit): array
{
$files = [];
$uploadDir = $this->getUploadDir();
$fileSystem = new Filesystem();
if (!$fileSystem->exists($uploadDir)) {
try {
$fileSystem->mkdir($uploadDir);
} catch (IOException) {
return [
'data' => [],
'page' => $page,
'limit' => $limit,
'totalItems' => 0,
'totalPages' => 0,
'hasNextPage' => false,
'hasPreviousPage' => false,
];
}
}
$finder = new Finder();
$finder->files()->in($uploadDir)->sortByModifiedTime()->reverseSorting();
$totalFiles = iterator_count($finder);
$totalPages = (int) ceil($totalFiles / $limit);
// Check if the requested page is out of range
if ($page < 1 || $page > $totalPages) {
return [
'data' => [],
'page' => $page,
'limit' => $limit,
'totalItems' => $totalFiles,
'totalPages' => $totalPages,
'hasNextPage' => $page < $totalPages,
'hasPreviousPage' => $page > 1,
];
}
$offset = ($page - 1) * $limit;
$filesIterator = new \LimitIterator($finder->getIterator(), $offset, $limit);
foreach ($filesIterator as $file) {
if (in_array($file->getRelativePath(), $this->coreParametersHelper->get('image_path_exclude'))) {
continue;
}
$fileInfo = $this->getFileInfo($file);
if ($fileInfo) {
$files[] = $fileInfo;
}
}
return [
'data' => $files,
'page' => $page,
'limit' => $limit,
'totalItems' => $totalFiles,
'totalPages' => $totalPages,
'hasNextPage' => $page < $totalPages,
'hasPreviousPage' => $page > 1,
];
}
/**
* @return array<string, mixed>|null
*/
private function getFileInfo(SplFileInfo $file): ?array
{
$filePath = $this->getCompleteFilePath($file->getRelativePathname());
$size = @getimagesize($filePath);
if ($size) {
return [
'src' => $this->getFullUrl($file->getRelativePathname()),
'width' => $size[0],
'height' => $size[1],
'type' => 'image',
];
} elseif (in_array($file->getExtension(), ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx'])) {
return [
'src' => $this->getFullUrl($file->getRelativePathname()),
'type' => 'document',
];
}
return null;
}
}