Source of file FileNameFilter.php
Size: 4,327 Bytes - Last Modified: 2021-12-23T10:27:40+00:00
/var/www/docs.ssmods.com/process/src/src/FileNameFilter.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 | <?php namespace SilverStripe\Assets; use SilverStripe\Core\Config\Configurable; use SilverStripe\Core\Injector\Injectable; use SilverStripe\View\Parsers\Transliterator; /** * Filter certain characters from file name, for nicer (more SEO-friendly) URLs * as well as better filesystem compatibility. * * Caution: Does not take care of full filename sanitization in regards to directory traversal etc., * please use PHP's built-in basename() for this purpose. * * For file name filtering see {@link FileNameFilter}. * * The default sanitizer is quite conservative regarding non-ASCII characters, * in order to achieve maximum filesystem compatibility. * In case your filesystem supports a wider character set, * or is case sensitive, you might want to relax these rules * via overriding {@link FileNameFilter_DefaultFilter::$default_replacements}. * * To leave uploaded filenames as they are (being aware of filesystem restrictions), * add the following code to your YAML config: * <code> * FileNameFilter: * default_use_transliterator: false * default_replacements: * </code> * * See {@link URLSegmentFilter} for a more generic implementation. */ class FileNameFilter { use Configurable; use Injectable; /** * @config * @var Boolean */ private static $default_use_transliterator = true; /** * @config * @var array See {@link setReplacements()}. */ private static $default_replacements = [ '/\s/' => '-', // remove whitespace '/[^-_A-Za-z0-9+.]+/' => '', // remove non-ASCII chars, only allow alphanumeric plus dash, dot, and underscore '/_{2,}/' => '_', // remove duplicate underscores (since `__` is variant separator) '/-{2,}/' => '-', // remove duplicate dashes '/^[-_\.]+/' => '', // Remove all leading dots, dashes or underscores ]; /** * @var array See {@link setReplacements()} */ public $replacements = []; /** * Depending on the applied replacement rules, this method * might result in an empty string. In this case, {@link getDefaultName()} * will be used to return a randomly generated file name, while retaining its extension. * * @param string $name including extension (not path). * @return string A filtered filename */ public function filter($name) { $ext = pathinfo($name, PATHINFO_EXTENSION); $transliterator = $this->getTransliterator(); if ($transliterator) { $name = $transliterator->toASCII($name); } foreach ($this->getReplacements() as $regex => $replace) { $name = preg_replace($regex, $replace, $name); } // Safeguard against empty file names $nameWithoutExt = pathinfo($name, PATHINFO_FILENAME); if (empty($nameWithoutExt)) { $name = $this->getDefaultName(); $name .= $ext ? '.' . $ext : ''; } return $name; } /** * Take care not to add replacements which might invalidate the file structure, * e.g. removing dots will remove file extension information. * * @param array $replacements Map of find/replace used for preg_replace(). */ public function setReplacements($replacements) { $this->replacements = $replacements; } /** * @return array */ public function getReplacements() { return $this->replacements ?: (array)$this->config()->get('default_replacements'); } /** * Transliterator instance, or false to disable. * If null will use default. * * @var Transliterator|false */ protected $transliterator; /** * @return Transliterator */ public function getTransliterator() { if ($this->transliterator === null && $this->config()->default_use_transliterator) { $this->transliterator = Transliterator::create(); } return $this->transliterator; } /** * @param Transliterator|false $transliterator */ public function setTransliterator($transliterator) { $this->transliterator = $transliterator; } /** * @return string File name without extension */ public function getDefaultName() { return (string)uniqid(); } } |