Storage
Voltis provides you with a Storage service which gives you the ability to interact with a filesystem in order to work with files and directories. Right now only a local storage driver is supported but it is planned to support filesystems such as S3, FTP and external storage like Dropbox and Google drive.
Accessing the Storage service
When you need to interact with a file-system, you can use the Storage service Facade:
use Voltis\Storage\Facade\Storage;
Storage::drive("local")->read("/logs/access.log");
By calling Storage::drive("local")
the Storage service will send back an instance of the filesystem drive you have specified, in this example we have selected to use the local drive which uses the local filesystem driver.
Currently, the only supported file-system is local storage, the filesystem where your application is located. We are working to implement storage drivers for S3, FTP and external storage like Dropbox and Google Drive etc.
Storage Configuration
To configure your filesystems, all the options are located in /config/filesystem.php
and in there you can change your root directory for each of your configured drives.
"default" => "local",
"drives" => [
"local" => [
"driver" => "local",
"root" => ROOT_DIR . "/storage/app",
],
"public" => [
"driver" => "local",
"root" => ROOT_DIR . "/storage/app/public",
]
]
When you interact with files using the local "drive" the root set in the config will be used when you interact using that "drive".
You may add as many "drives" as you need, you may use as many drivers as you need as well, just make sure each "drive" has a unique name.
Using the default drive
By default you would usually access a filesystem via the drive()
function to select a filesystem to interact with but in your configuration, if you have set the default
drive, you don’t need to select a drive using the drive()
function. Just start using like so:
Storage::read("/logs/error.log");
Reading Files
Storage::drive("local")->read("/logs/error.log");
Calling read()
with the file path will return the contents of the file you wish to read. The entire file is read and returned with the file handle being closed once done. The read method will obtain a shared reader lock which prevents any processes from writing until all reads are complete.
Writing to Files
Storage::drive("local")->write("/error/last_error/error.txt", "[10:29 21/04/2020] - ...");
The file will be created if it does not exist. By default the second parameter is set to null
so you are not required to pass in file contents to write to the file. The default writing mode is ab
. The write method obtains a file lock which blocks any other file writes, the process will wait until a lock is released but not block the entire server. The write mode w+
does not work with file locking.
Prepending
Storage::drive("local")->prepend("/error/last_error/error.txt", "[10:28 21/04/2020] - ...");
This will prepend the file with the contents passed as the second parameter. The prepend()
function uses php:://temp
to make it possible to prepend to a file.
caution
Be careful when appending, using this function uses memory to achieve a file prepend operation and will use a lot of memory with a large file
Appending
Storage::drive("local")->append("/error/last_error/error.txt", "[10:34 21/04/2020] - ...");
This will append the contents you want to write to the end of a file using the a+
write mode.
Copying
Storage::drive("local")->copy("/log/error.log", "/backups/logs/error.log.bak");
The copy()
function requires a source and destination and will copy the file with the destination file name as well.
Moving a file
Storage::drive("local")->move("", "");
The move()
function accepts an old file path, new file path.
This function will return the file path that was used to save the moved file.
Deleting a file
To delete a file called user_profile_image_292827.png
we would do:
Storage::drive("local")->delete("/images/profile/user_profile_image_292827.png");
Deleting multiple files at once
The delete()
function also allows you to pass in an array of files to delete:
$filesToDel = [
"/images/profile/user_profile_image_292827.png",
"/images/profile/user_profile_image_998740.png",
];
Storage::drive("local")->delete($filesToDel);
Creating a directory
Storage::drive("local")->makeDir("/logs/user/activity", $mode = 0777);
Creates a new directory /logs/user/activity
using the default mode 0777
.
Deleting a directory
Storage::drive("local")->removeDir("/logs/user/activity");
Will delete the directory /activity
only, will not delete the full path of directories. The directory also has to be empty first.