/** * Converts a file instance to a JSON serializable object. * * @param MOXMAN_Vfs_IFile $file File to convert into JSON format. * @param Boolean $meta State if the meta data should be returned or not. * @return stdClass JSON serializable object. */ public static function fileToJson($file, $meta = false) { $config = $file->getConfig(); $renameFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "rename"); $editFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "edit"); $viewFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "view"); $configuredFilter = new MOXMAN_Vfs_BasicFileFilter(); $configuredFilter->setIncludeDirectoryPattern($config->get('filesystem.include_directory_pattern')); $configuredFilter->setExcludeDirectoryPattern($config->get('filesystem.exclude_directory_pattern')); $configuredFilter->setIncludeFilePattern($config->get('filesystem.include_file_pattern')); $configuredFilter->setExcludeFilePattern($config->get('filesystem.exclude_file_pattern')); $configuredFilter->setIncludeExtensions($config->get('filesystem.extensions')); $result = (object) array("path" => $file->getPublicPath(), "size" => $file->getSize(), "lastModified" => $file->getLastModified(), "isFile" => $file->isFile(), "canRead" => $file->canRead(), "canWrite" => $file->canWrite(), "canEdit" => $file->isFile() && $editFilter->accept($file), "canRename" => $renameFilter->accept($file), "canView" => $file->isFile() && $viewFilter->accept($file), "canPreview" => $file->isFile() && MOXMAN_Media_ImageAlter::canEdit($file), "visible" => $configuredFilter->accept($file), "exists" => $file->exists()); if ($meta) { $args = new MOXMAN_Vfs_CustomInfoEventArgs(MOXMAN_Vfs_CustomInfoEventArgs::INSERT_TYPE, $file); MOXMAN::getPluginManager()->get("core")->fire("CustomInfo", $args); $metaData = (object) array_merge($file->getMetaData()->getAll(), $args->getInfo()); if (MOXMAN_Media_ImageAlter::canEdit($file)) { $thumbnailFolderPath = MOXMAN_Util_PathUtils::combine($file->getParent(), $config->get('thumbnail.folder')); $thumbnailFile = MOXMAN::getFile($thumbnailFolderPath, $config->get('thumbnail.prefix') . $file->getName()); // TODO: Implement stat info cache layer here if ($file instanceof MOXMAN_Vfs_Local_File) { $info = MOXMAN_Media_MediaInfo::getInfo($file->getPath()); $metaData->width = $info["width"]; $metaData->height = $info["height"]; } if ($thumbnailFile->exists()) { $metaData->thumb_url = $thumbnailFile->getUrl(); // Get image size server side only on local filesystem if ($file instanceof MOXMAN_Vfs_Local_File) { $info = MOXMAN_Media_MediaInfo::getInfo($thumbnailFile->getPath()); $metaData->thumb_width = $info["width"]; $metaData->thumb_height = $info["height"]; } } } $metaData->url = $file->getUrl(); $result->meta = $metaData; } return $result; }
/** * Applies formats to an image. * * @param MOXMAN_Vfs_IFile $file File to generate images for. */ public function applyFormat(MOXMAN_Vfs_IFile $file) { if (!$file->exists() || !MOXMAN_Media_ImageAlter::canEdit($file)) { return; } $config = $file->getConfig(); $format = $config->get("autoformat.rules", ""); $quality = $config->get("autoformat.jpeg_quality", 90); // @codeCoverageIgnoreStart if (!$format) { return; } // @codeCoverageIgnoreEnd $chunks = preg_split('/,/', $format, 0, PREG_SPLIT_NO_EMPTY); $imageInfo = MOXMAN_Media_MediaInfo::getInfo($file); $width = $imageInfo["width"]; $height = $imageInfo["height"]; foreach ($chunks as $chunk) { $parts = explode('=', $chunk); $actions = array(); $fileName = preg_replace('/\\..+$/', '', $file->getName()); $extension = preg_replace('/^.+\\./', '', $file->getName()); $targetWidth = $newWidth = $width; $targetHeight = $newHeight = $height; $items = explode('|', $parts[0]); foreach ($items as $item) { switch ($item) { case "gif": case "jpg": case "jpeg": case "png": $extension = $item; break; default: $matches = array(); if (preg_match('/\\s?([0-9|\\*]+)\\s?x([0-9|\\*]+)\\s?/', $item, $matches)) { $actions[] = "resize"; $targetWidth = $matches[1]; $targetHeight = $matches[2]; if ($targetWidth == '*') { // Width is omitted $targetWidth = floor($width / ($height / $targetHeight)); } if ($targetHeight == '*') { // Height is omitted $targetHeight = floor($height / ($width / $targetWidth)); } } } } // Scale it if ($targetWidth != $width || $targetHeight != $height) { $scale = min($targetWidth / $width, $targetHeight / $height); $newWidth = $scale > 1 ? $width : floor($width * $scale); $newHeight = $scale > 1 ? $height : floor($height * $scale); } // Build output path $outPath = $parts[1]; $outPath = str_replace("%f", $fileName, $outPath); $outPath = str_replace("%e", $extension, $outPath); $outPath = str_replace("%ow", "" . $width, $outPath); $outPath = str_replace("%oh", "" . $height, $outPath); $outPath = str_replace("%tw", "" . $targetWidth, $outPath); $outPath = str_replace("%th", "" . $targetHeight, $outPath); $outPath = str_replace("%w", "" . $newWidth, $outPath); $outPath = str_replace("%h", "" . $newHeight, $outPath); $outFile = MOXMAN::getFileSystemManager()->getFile($file->getParent(), $outPath); // Make dirs $parents = array(); $parent = $outFile->getParentFile(); while ($parent) { if ($parent->exists()) { break; } $parents[] = $parent; $parent = $parent->getParentFile(); } for ($i = count($parents) - 1; $i >= 0; $i--) { $parents[$i]->mkdir(); $args = new MOXMAN_Core_FileActionEventArgs(MOXMAN_Core_FileActionEventArgs::ADD, $parents[$i]); $args->getData()->format = true; MOXMAN::getPluginManager()->get("core")->fire("FileAction", $args); } if (count($actions) > 0) { foreach ($actions as $action) { switch ($action) { case 'resize': $imageAlter = new MOXMAN_Media_ImageAlter(); $tempFilePath = MOXMAN::getFileSystemManager()->getLocalTempPath($file); $imageAlter->load($file->exportTo($tempFilePath)); $imageAlter->resize($newWidth, $newHeight); $outFileTempPath = MOXMAN::getFileSystemManager()->getLocalTempPath($outFile); $imageAlter->save($outFileTempPath, $quality); $outFile->importFrom($outFileTempPath); $args = new MOXMAN_Core_FileActionEventArgs(MOXMAN_Core_FileActionEventArgs::ADD, $outFile); $args->getData()->format = true; MOXMAN::getPluginManager()->get("core")->fire("FileAction", $args); break; } } } else { $imageAlter = new MOXMAN_Media_ImageAlter(); $tempFilePath = MOXMAN::getFileSystemManager()->getLocalTempPath($file); $imageAlter->load($file->exportTo($tempFilePath)); $outFileTempPath = MOXMAN::getFileSystemManager()->getLocalTempPath($outFile); $imageAlter->save($outFileTempPath, $quality); $outFile->importFrom($outFileTempPath); $args = new MOXMAN_Core_FileActionEventArgs(MOXMAN_Core_FileActionEventArgs::ADD, $outFile); $args->getData()->format = true; MOXMAN::getPluginManager()->get("core")->fire("FileAction", $args); } } }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $url = isset($params->url) ? $params->url : ""; $path = isset($params->path) ? $params->path : "{default}"; $lastPath = isset($params->lastPath) ? $params->lastPath : ""; $offset = isset($params->offset) ? $params->offset : 0; $length = isset($params->length) ? $params->length : null; $orderBy = isset($params->orderBy) ? $params->orderBy : "name"; $desc = isset($params->desc) ? $params->desc : false; // Result URL to closest file $file = null; if ($url) { try { $file = MOXMAN::getFile($url); } catch (MOXMAN_Exception $e) { // Might throw exception ignore it $file = null; } if ($file) { if ($file->exists()) { $urlFile = $file; } while (!$file->exists() || !$file->isDirectory()) { $file = $file->getParentFile(); } } } // Resolve lastPath input if ($lastPath && !$file) { try { $file = MOXMAN::getFile($lastPath); } catch (MOXMAN_Exception $e) { // Might throw exception ignore it $file = null; } if ($file) { while (!$file->exists() || !$file->isDirectory()) { $file = $file->getParentFile(); } } } $file = $file ? $file : MOXMAN::getFile($path); // Force update on cached file info if (isset($params->force) && $params->force) { MOXMAN_Vfs_Cache_FileInfoStorage::getInstance()->updateFileList($file); } if (!$file->isDirectory()) { throw new MOXMAN_Exception("Path isn't a directory: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_TYPE); } $config = $file->getConfig(); // Setup input file filter $paramsFileFilter = new MOXMAN_Vfs_BasicFileFilter(); if (isset($params->include_directory_pattern) && $params->include_directory_pattern) { $paramsFileFilter->setIncludeDirectoryPattern($params->include_directory_pattern); } if (isset($params->exclude_directory_pattern) && $params->exclude_directory_pattern) { $paramsFileFilter->setExcludeDirectoryPattern($params->exclude_directory_pattern); } if (isset($params->include_file_pattern) && $params->include_file_pattern) { $paramsFileFilter->setIncludeFilePattern($params->include_file_pattern); } if (isset($params->exclude_file_pattern) && $params->exclude_file_pattern) { $paramsFileFilter->setExcludeFilePattern($params->exclude_file_pattern); } if (isset($params->extensions) && $params->extensions) { $paramsFileFilter->setIncludeExtensions($params->extensions); } if (isset($params->filter) && $params->filter != null) { $paramsFileFilter->setIncludeWildcardPattern($params->filter); } if (isset($params->only_dirs) && $params->only_dirs === true) { $paramsFileFilter->setOnlyDirs(true); } if (isset($params->only_files) && $params->only_files === true) { $paramsFileFilter->setOnlyFiles(true); } // Setup file filter $configuredFilter = new MOXMAN_Vfs_BasicFileFilter(); $configuredFilter->setIncludeDirectoryPattern($config->get('filesystem.include_directory_pattern')); $configuredFilter->setExcludeDirectoryPattern($config->get('filesystem.exclude_directory_pattern')); $configuredFilter->setIncludeFilePattern($config->get('filesystem.include_file_pattern')); $configuredFilter->setExcludeFilePattern($config->get('filesystem.exclude_file_pattern')); $configuredFilter->setIncludeExtensions($config->get('filesystem.extensions')); // Setup combined filter $combinedFilter = new MOXMAN_Vfs_CombinedFileFilter(); $combinedFilter->addFilter($paramsFileFilter); $combinedFilter->addFilter($configuredFilter); $files = $file->listFilesFiltered($combinedFilter)->limit($offset, $length)->orderBy($orderBy, $desc); $args = $this->fireFilesAction(MOXMAN_Vfs_FileActionEventArgs::LIST_FILES, $file, $files); $files = $args->getFileList(); $renameFilter = MOXMAN_Vfs_BasicFileFilter::createFromConfig($file->getConfig(), "rename"); $editFilter = MOXMAN_Vfs_BasicFileFilter::createFromConfig($file->getConfig(), "edit"); $viewFilter = MOXMAN_Vfs_BasicFileFilter::createFromConfig($file->getConfig(), "view"); // List thumbnails and make lookup table $thumbnails = array(); $thumbnailFolder = $config->get("thumbnail.folder"); $thumbnailPrefix = $config->get("thumbnail.prefix"); if ($config->get('thumbnail.enabled')) { $thumbFolderFile = MOXMAN::getFile($file->getPath(), $thumbnailFolder); // Force update on cached file info if (isset($params->force) && $params->force) { MOXMAN_Vfs_Cache_FileInfoStorage::getInstance()->updateFileList($thumbFolderFile); } if ($file instanceof MOXMAN_Vfs_Local_File === false) { $hasThumbnails = false; foreach ($files as $subFile) { if (MOXMAN_Media_ImageAlter::canEdit($subFile)) { $hasThumbnails = true; break; } } if ($hasThumbnails) { $thumbFiles = $thumbFolderFile->listFilesFiltered($combinedFilter)->limit($offset, $length)->orderBy($orderBy, $desc); foreach ($thumbFiles as $thumbFile) { $thumbnails[$thumbFile->getName()] = true; } } } else { // Stat individual files on local fs faster than listing 1000 files $fileSystem = $thumbFolderFile->getFileSystem(); foreach ($files as $subFile) { if (MOXMAN_Media_ImageAlter::canEdit($subFile)) { $thumbFile = $fileSystem->getFile(MOXMAN_Util_PathUtils::combine($thumbFolderFile->getPath(), $thumbnailPrefix . $subFile->getName())); if ($thumbFile->exists()) { $thumbnails[$thumbFile->getName()] = true; } } } } } $result = (object) array("columns" => array("name", "size", "modified", "attrs", "info"), "config" => $this->getPublicConfig($file), "file" => $this->fileToJson($file, true), "urlFile" => isset($urlFile) ? $this->fileToJson($urlFile, true) : null, "data" => array(), "url" => $file->getUrl(), "thumbnailFolder" => $thumbnailFolder, "thumbnailPrefix" => $thumbnailPrefix, "total" => $files->getCount()); foreach ($files as $subFile) { $attrs = $subFile->isDirectory() ? "d" : "-"; $attrs .= $subFile->canRead() ? "r" : "-"; $attrs .= $subFile->canWrite() ? "w" : "-"; $attrs .= $renameFilter->accept($subFile) ? "r" : "-"; $attrs .= $subFile->isFile() && $editFilter->accept($subFile) ? "e" : "-"; $attrs .= $subFile->isFile() && $viewFilter->accept($subFile) ? "v" : "-"; $attrs .= $subFile->isFile() && MOXMAN_Media_ImageAlter::canEdit($subFile) ? "p" : "-"; $attrs .= isset($thumbnails[$thumbnailPrefix . $subFile->getName()]) ? "t" : "-"; $args = $this->fireCustomInfo(MOXMAN_Vfs_CustomInfoEventArgs::LIST_TYPE, $subFile); $custom = (object) $args->getInfo(); if ($subFile->getPublicLinkPath()) { $custom->link = $subFile->getPublicLinkPath(); } $result->data[] = array($subFile->getName(), $subFile->isDirectory() ? 0 : $subFile->getSize(), $subFile->getLastModified(), $attrs, $custom); } return $result; }
/** * Converts a file instance to a JSON serializable object. * * @param MOXMAN_Vfs_IFile $file File to convert into JSON format. * @param Boolean $meta State if the meta data should be returned or not. * @return stdClass JSON serializable object. */ public static function fileToJson($file, $meta = false) { $config = $file->getConfig(); $renameFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "rename"); $editFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "edit"); $viewFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "view"); $result = (object) array("path" => $file->getPublicPath(), "size" => $file->getSize(), "lastModified" => $file->getLastModified(), "isFile" => $file->isFile(), "canRead" => $file->canRead(), "canWrite" => $file->canWrite(), "canEdit" => $file->isFile() && $editFilter->accept($file) === MOXMAN_Vfs_IFileFilter::ACCEPTED, "canRename" => $renameFilter->accept($file) === MOXMAN_Vfs_IFileFilter::ACCEPTED, "canView" => $file->isFile() && $viewFilter->accept($file) === MOXMAN_Vfs_IFileFilter::ACCEPTED, "canPreview" => $file->isFile() && MOXMAN_Media_ImageAlter::canEdit($file), "exists" => $file->exists()); if ($meta) { $metaData = $file->getMetaData(); //$args = $this->fireCustomInfo(MOXMAN_Core_CustomInfoEventArgs::INSERT_TYPE, $file); $metaData = (object) $metaData->getAll(); if ($file instanceof MOXMAN_Vfs_Local_File && MOXMAN_Media_ImageAlter::canEdit($file)) { $thumbnailFolderPath = MOXMAN_Util_PathUtils::combine($file->getParent(), $config->get('thumbnail.folder')); $thumbnailFile = MOXMAN::getFile($thumbnailFolderPath, $config->get('thumbnail.prefix') . $file->getName()); // TODO: Implement stat info cache layer here $info = MOXMAN_Media_MediaInfo::getInfo($file); $metaData->width = $info["width"]; $metaData->height = $info["height"]; if ($thumbnailFile->exists()) { $metaData->thumb_url = $thumbnailFile->getUrl(); $info = MOXMAN_Media_MediaInfo::getInfo($thumbnailFile); $metaData->thumb_width = $info["width"]; $metaData->thumb_height = $info["height"]; } } $metaData->url = $file->getUrl(); $result->meta = $metaData; } return $result; }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $url = isset($params->url) ? $params->url : ''; $path = isset($params->path) ? $params->path : '{default}'; // Result URL to closest file $file = null; if ($url) { try { $file = MOXMAN::getFile($url); } catch (MOXMAN_Exception $e) { // Might throw exception ignore it $file = null; } if ($file) { if ($file->exists()) { $urlFile = $file; } while (!$file->exists() || !$file->isDirectory()) { $file = $file->getParentFile(); } } } $file = $file ? $file : MOXMAN::getFile($path); if (!$file->isDirectory()) { throw new MOXMAN_Exception("Path isn't a directory: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_TYPE); } $config = $file->getConfig(); // Setup input file filter $paramsFileFilter = new MOXMAN_Vfs_BasicFileFilter(); if (isset($params->include_directory_pattern) && $params->include_directory_pattern) { $paramsFileFilter->setIncludeDirectoryPattern($params->include_directory_pattern); } if (isset($params->exclude_directory_pattern) && $params->exclude_directory_pattern) { $paramsFileFilter->setExcludeDirectoryPattern($params->exclude_directory_pattern); } if (isset($params->include_file_pattern) && $params->include_file_pattern) { $paramsFileFilter->setIncludeFilePattern($params->include_file_pattern); } if (isset($params->exclude_file_pattern) && $params->exclude_file_pattern) { $paramsFileFilter->setExcludeFilePattern($params->exclude_file_pattern); } if (isset($params->extensions) && $params->extensions) { $paramsFileFilter->setIncludeExtensions($params->extensions); } if (isset($params->filter) && $params->filter != null) { $paramsFileFilter->setIncludeWildcardPattern($params->filter); } if (isset($params->only_dirs) && $params->only_dirs === true) { $paramsFileFilter->setOnlyDirs(true); } if (isset($params->only_files) && $params->only_files === true) { $paramsFileFilter->setOnlyFiles(true); } // Setup file filter $configuredFilter = new MOXMAN_Vfs_BasicFileFilter(); $configuredFilter->setIncludeDirectoryPattern($config->get('filesystem.include_directory_pattern')); $configuredFilter->setExcludeDirectoryPattern($config->get('filesystem.exclude_directory_pattern')); $configuredFilter->setIncludeFilePattern($config->get('filesystem.include_file_pattern')); $configuredFilter->setExcludeFilePattern($config->get('filesystem.exclude_file_pattern')); $configuredFilter->setIncludeExtensions($config->get('filesystem.extensions')); // Setup combined filter $combinedFilter = new MOXMAN_Vfs_CombinedFileFilter(); $combinedFilter->addFilter($paramsFileFilter); $combinedFilter->addFilter($configuredFilter); $files = $file->listFilesFiltered($combinedFilter); $args = $this->fireFilesAction(MOXMAN_Core_FileActionEventArgs::LIST_FILES, $file, $files); $files = $args->getFileList(); $renameFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($file->getConfig(), "rename"); $editFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($file->getConfig(), "edit"); $viewFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($file->getConfig(), "view"); $result = (object) array("columns" => array("name", "size", "modified", "attrs", "info"), "config" => $this->getPublicConfig($file), "file" => $this->fileToJson($file, true), "urlFile" => isset($urlFile) ? $this->fileToJson($urlFile, true) : null, "data" => array()); foreach ($files as $subFile) { $attrs = $subFile->isDirectory() ? "d" : "-"; $attrs .= $subFile->canRead() ? "r" : "-"; $attrs .= $subFile->canWrite() ? "w" : "-"; $attrs .= $renameFilter->accept($subFile) === MOXMAN_Vfs_CombinedFileFilter::ACCEPTED ? "r" : "-"; $attrs .= $subFile->isFile() && $editFilter->accept($subFile) === MOXMAN_Vfs_CombinedFileFilter::ACCEPTED ? "e" : "-"; $attrs .= $subFile->isFile() && $viewFilter->accept($subFile) === MOXMAN_Vfs_CombinedFileFilter::ACCEPTED ? "v" : "-"; $attrs .= $subFile->isFile() && MOXMAN_Media_ImageAlter::canEdit($subFile) ? "p" : "-"; $args = $this->fireCustomInfo(MOXMAN_Core_CustomInfoEventArgs::LIST_TYPE, $subFile); $custom = (object) $args->getInfo(); if ($subFile->getPublicLinkPath()) { $custom->link = $subFile->getPublicLinkPath(); } $result->data[] = array($subFile->getName(), $subFile->isDirectory() ? 0 : $subFile->getSize(), $subFile->getLastModified(), $attrs, $custom); } return $result; }
/** * Removes formats from an image. * * @param MOXMAN_Vfs_IFile $file File to generate images for. */ public function removeFormat(MOXMAN_Vfs_IFile $file) { $files = array(); $config = $file->getConfig(); $format = $config->get("autoformat.rules", ""); if (!$format || !$file->exists() || !MOXMAN_Media_ImageAlter::canEdit($file)) { return $files; } if ($config->get("autoformat.delete_format_images", true) === false) { return $files; } // Export to temp file $tempFilePath = MOXMAN::getFileSystemManager()->getLocalTempPath($file); $file->exportTo($tempFilePath); $chunks = preg_split('/,/', $format, 0, PREG_SPLIT_NO_EMPTY); $imageInfo = MOXMAN_Media_MediaInfo::getInfo($tempFilePath); $width = $imageInfo["width"]; $height = $imageInfo["height"]; foreach ($chunks as $chunk) { $parts = explode('=', $chunk); $fileName = preg_replace('/\\..+$/', '', $file->getName()); $extension = preg_replace('/^.+\\./', '', $file->getName()); $targetWidth = $newWidth = $width; $targetHeight = $newHeight = $height; $items = explode('|', $parts[0]); foreach ($items as $item) { switch ($item) { case "gif": case "jpg": case "jpeg": case "png": $extension = $item; break; default: $matches = array(); if (preg_match('/\\s?([0-9|\\*]+)\\s?x([0-9|\\*]+)\\s?/', $item, $matches)) { $targetWidth = $matches[1]; $targetHeight = $matches[2]; if ($targetWidth == '*') { // Width is omitted $targetWidth = floor($width / ($height / $targetHeight)); } if ($targetHeight == '*') { // Height is omitted $targetHeight = floor($height / ($width / $targetWidth)); } } } } // Scale it if ($targetWidth != $width || $targetHeight != $height) { $scale = min($targetWidth / $width, $targetHeight / $height); $newWidth = $scale > 1 ? $width : floor($width * $scale); $newHeight = $scale > 1 ? $height : floor($height * $scale); } // Build output path $outPath = $parts[1]; $outPath = str_replace("%f", $fileName, $outPath); $outPath = str_replace("%e", $extension, $outPath); $outPath = str_replace("%ow", "" . $width, $outPath); $outPath = str_replace("%oh", "" . $height, $outPath); $outPath = str_replace("%tw", "" . $targetWidth, $outPath); $outPath = str_replace("%th", "" . $targetHeight, $outPath); $outPath = str_replace("%w", "" . $newWidth, $outPath); $outPath = str_replace("%h", "" . $newHeight, $outPath); $outFile = MOXMAN::getFileSystemManager()->getFile($file->getParent(), $outPath); if ($outFile->exists()) { $outFile->delete(); $files[] = $outFile; } } return $files; }