Loading docs/src/getting-started/install.md +16 −2 Original line number Diff line number Diff line Loading @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | ### S3 ### Media storage By default, files are saved to the `public/media` folder using the file system. If you need to relocate the `media` folder to a different location, you can specify it in your `.env` file as shown below: ```ini # […] By default, files are stored in the `public/media` folder using the filesystem. media.root="media" media.storage="/mnt/storage" ``` In this example, the files will be saved to the /mnt/storage/media folder. Make sure to also update your web server configuration to reflect this change. ### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: Loading modules/Admin/Controllers/SettingsController.php +8 −8 Original line number Diff line number Diff line Loading @@ -61,7 +61,7 @@ class SettingsController extends BaseController helper(['filesystem', 'media']); // delete site folder in media before repopulating it delete_files(media_path('/site')); delete_files(media_path_absolute('/site')); // save original in disk $originalFilename = (new FS(config('Media')))->save( Loading @@ -71,9 +71,9 @@ class SettingsController extends BaseController // convert jpeg image to png if not if ($siteIconFile->getClientMimeType() !== 'image/png') { service('image')->withFile(media_path($originalFilename)) service('image')->withFile(media_path_absolute($originalFilename)) ->convert(IMAGETYPE_JPEG) ->save(media_path('/site/icon.png')); ->save(media_path_absolute('/site/icon.png')); } // generate random hash to use as a suffix to renew browser cache Loading @@ -81,15 +81,15 @@ class SettingsController extends BaseController // generate ico $ico_lib = new PHP_ICO(); $ico_lib->add_image(media_path('/site/icon.png'), [[32, 32], [64, 64]]); $ico_lib->save_ico(media_path("/site/favicon.{$randomHash}.ico")); $ico_lib->add_image(media_path_absolute('/site/icon.png'), [[32, 32], [64, 64]]); $ico_lib->save_ico(media_path_absolute("/site/favicon.{$randomHash}.ico")); // resize original to needed sizes foreach ([64, 180, 192, 512] as $size) { service('image') ->withFile(media_path('/site/icon.png')) ->withFile(media_path_absolute('/site/icon.png')) ->resize($size, $size) ->save(media_path("/site/icon-{$size}.{$randomHash}.png")); ->save(media_path_absolute("/site/icon-{$size}.{$randomHash}.png")); } service('settings') Loading @@ -109,7 +109,7 @@ class SettingsController extends BaseController { helper(['filesystem', 'media']); // delete site folder in media delete_files(media_path('/site')); delete_files(media_path_absolute('/site')); service('settings') ->forget('App.siteIcon'); Loading modules/Media/Config/Media.php +8 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,14 @@ class Media extends BaseConfig */ public string $root = 'media'; /** * -------------------------------------------------------------------------- * Media storage folder * -------------------------------------------------------------------------- * Defines the folder used to store the media root folder */ public string $storage = ROOTPATH . 'public'; /** * @var array<string, string> */ Loading modules/Media/FileManagers/FS.php +10 −8 Original line number Diff line number Diff line Loading @@ -21,11 +21,13 @@ class FS implements FileManagerInterface */ public function save(File $file, string $path): string | false { helper('media'); if ((pathinfo($path, PATHINFO_EXTENSION) === '') && (($extension = $file->getExtension()) !== '')) { $path = $path . '.' . $extension; } $mediaRoot = $this->config->root; $mediaRoot = media_path_absolute(); if (! file_exists(dirname($mediaRoot . '/' . $path))) { mkdir(dirname($mediaRoot . '/' . $path), 0777, true); Loading @@ -49,7 +51,7 @@ class FS implements FileManagerInterface { helper('media'); return unlink(media_path($key)); return unlink(media_path_absolute($key)); } public function getUrl(string $key): string Loading @@ -68,21 +70,21 @@ class FS implements FileManagerInterface { helper('media'); return rename(media_path($oldKey), media_path($newKey)); return rename(media_path_absolute($oldKey), media_path_absolute($newKey)); } public function getFileContents(string $key): string { helper('media'); return (string) file_get_contents(media_path($key)); return (string) file_get_contents(media_path_absolute($key)); } public function getFileInput(string $key): string { helper('media'); return media_path($key); return media_path_absolute($key); } public function deletePodcastImageSizes(string $podcastHandle): bool Loading @@ -91,7 +93,7 @@ class FS implements FileManagerInterface $allPodcastImagesPaths = []; foreach (['jpg', 'jpeg', 'png', 'webp'] as $ext) { $images = glob(media_path("/podcasts/{$podcastHandle}/*_*{$ext}")); $images = glob(media_path_absolute("/podcasts/{$podcastHandle}/*_*{$ext}")); if (! $images) { return false; Loading @@ -115,7 +117,7 @@ class FS implements FileManagerInterface $allPersonsImagesPaths = []; foreach (['jpg', 'jpeg', 'png', 'webp'] as $ext) { $images = glob(media_path("/persons/*_*{$ext}")); $images = glob(media_path_absolute("/persons/*_*{$ext}")); if (! $images) { return false; Loading @@ -137,6 +139,6 @@ class FS implements FileManagerInterface { helper('media'); return is_really_writable(ROOTPATH . 'public/' . media_path()); return is_really_writable(media_path_absolute()); } } modules/Media/Helpers/media_helper.php +12 −0 Original line number Diff line number Diff line Loading @@ -82,3 +82,15 @@ if (! function_exists('media_path')) { return config('Media')->root . '/' . $uri; } } if (! function_exists('media_path_absolute')) { /** * Prefixes the absolute storage directory to the media path of a given uri * * @param string|string[] $uri URI string or array of URI segments */ function media_path_absolute(string | array $uri = ''): string { return config('Media')->storage . '/' . media_path($uri); } } Loading
docs/src/getting-started/install.md +16 −2 Original line number Diff line number Diff line Loading @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | ### S3 ### Media storage By default, files are saved to the `public/media` folder using the file system. If you need to relocate the `media` folder to a different location, you can specify it in your `.env` file as shown below: ```ini # […] By default, files are stored in the `public/media` folder using the filesystem. media.root="media" media.storage="/mnt/storage" ``` In this example, the files will be saved to the /mnt/storage/media folder. Make sure to also update your web server configuration to reflect this change. ### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: Loading
modules/Admin/Controllers/SettingsController.php +8 −8 Original line number Diff line number Diff line Loading @@ -61,7 +61,7 @@ class SettingsController extends BaseController helper(['filesystem', 'media']); // delete site folder in media before repopulating it delete_files(media_path('/site')); delete_files(media_path_absolute('/site')); // save original in disk $originalFilename = (new FS(config('Media')))->save( Loading @@ -71,9 +71,9 @@ class SettingsController extends BaseController // convert jpeg image to png if not if ($siteIconFile->getClientMimeType() !== 'image/png') { service('image')->withFile(media_path($originalFilename)) service('image')->withFile(media_path_absolute($originalFilename)) ->convert(IMAGETYPE_JPEG) ->save(media_path('/site/icon.png')); ->save(media_path_absolute('/site/icon.png')); } // generate random hash to use as a suffix to renew browser cache Loading @@ -81,15 +81,15 @@ class SettingsController extends BaseController // generate ico $ico_lib = new PHP_ICO(); $ico_lib->add_image(media_path('/site/icon.png'), [[32, 32], [64, 64]]); $ico_lib->save_ico(media_path("/site/favicon.{$randomHash}.ico")); $ico_lib->add_image(media_path_absolute('/site/icon.png'), [[32, 32], [64, 64]]); $ico_lib->save_ico(media_path_absolute("/site/favicon.{$randomHash}.ico")); // resize original to needed sizes foreach ([64, 180, 192, 512] as $size) { service('image') ->withFile(media_path('/site/icon.png')) ->withFile(media_path_absolute('/site/icon.png')) ->resize($size, $size) ->save(media_path("/site/icon-{$size}.{$randomHash}.png")); ->save(media_path_absolute("/site/icon-{$size}.{$randomHash}.png")); } service('settings') Loading @@ -109,7 +109,7 @@ class SettingsController extends BaseController { helper(['filesystem', 'media']); // delete site folder in media delete_files(media_path('/site')); delete_files(media_path_absolute('/site')); service('settings') ->forget('App.siteIcon'); Loading
modules/Media/Config/Media.php +8 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,14 @@ class Media extends BaseConfig */ public string $root = 'media'; /** * -------------------------------------------------------------------------- * Media storage folder * -------------------------------------------------------------------------- * Defines the folder used to store the media root folder */ public string $storage = ROOTPATH . 'public'; /** * @var array<string, string> */ Loading
modules/Media/FileManagers/FS.php +10 −8 Original line number Diff line number Diff line Loading @@ -21,11 +21,13 @@ class FS implements FileManagerInterface */ public function save(File $file, string $path): string | false { helper('media'); if ((pathinfo($path, PATHINFO_EXTENSION) === '') && (($extension = $file->getExtension()) !== '')) { $path = $path . '.' . $extension; } $mediaRoot = $this->config->root; $mediaRoot = media_path_absolute(); if (! file_exists(dirname($mediaRoot . '/' . $path))) { mkdir(dirname($mediaRoot . '/' . $path), 0777, true); Loading @@ -49,7 +51,7 @@ class FS implements FileManagerInterface { helper('media'); return unlink(media_path($key)); return unlink(media_path_absolute($key)); } public function getUrl(string $key): string Loading @@ -68,21 +70,21 @@ class FS implements FileManagerInterface { helper('media'); return rename(media_path($oldKey), media_path($newKey)); return rename(media_path_absolute($oldKey), media_path_absolute($newKey)); } public function getFileContents(string $key): string { helper('media'); return (string) file_get_contents(media_path($key)); return (string) file_get_contents(media_path_absolute($key)); } public function getFileInput(string $key): string { helper('media'); return media_path($key); return media_path_absolute($key); } public function deletePodcastImageSizes(string $podcastHandle): bool Loading @@ -91,7 +93,7 @@ class FS implements FileManagerInterface $allPodcastImagesPaths = []; foreach (['jpg', 'jpeg', 'png', 'webp'] as $ext) { $images = glob(media_path("/podcasts/{$podcastHandle}/*_*{$ext}")); $images = glob(media_path_absolute("/podcasts/{$podcastHandle}/*_*{$ext}")); if (! $images) { return false; Loading @@ -115,7 +117,7 @@ class FS implements FileManagerInterface $allPersonsImagesPaths = []; foreach (['jpg', 'jpeg', 'png', 'webp'] as $ext) { $images = glob(media_path("/persons/*_*{$ext}")); $images = glob(media_path_absolute("/persons/*_*{$ext}")); if (! $images) { return false; Loading @@ -137,6 +139,6 @@ class FS implements FileManagerInterface { helper('media'); return is_really_writable(ROOTPATH . 'public/' . media_path()); return is_really_writable(media_path_absolute()); } }
modules/Media/Helpers/media_helper.php +12 −0 Original line number Diff line number Diff line Loading @@ -82,3 +82,15 @@ if (! function_exists('media_path')) { return config('Media')->root . '/' . $uri; } } if (! function_exists('media_path_absolute')) { /** * Prefixes the absolute storage directory to the media path of a given uri * * @param string|string[] $uri URI string or array of URI segments */ function media_path_absolute(string | array $uri = ''): string { return config('Media')->storage . '/' . media_path($uri); } }