Class luya\admin\helpers\Storage
Inheritance | luya\admin\helpers\Storage |
---|---|
Available since version | 1.0.0 |
Source Code | https://github.com/luyadev/luya-module-admin/blob/master/src/helpers/Storage.php |
Helper class to handle remove, upload and moving of storage files.
The class provides common functions in order to work with the Storage component. This helper method will only work if the {{luya\admin\storage\BaseFileSystemStorage}} component is registered which is by default the case when the LUYA admin module is provided.
Public Methods
Method | Description | Defined By |
---|---|---|
extractFilesDataFromFilesArray() | Extract $_FILES array. | luya\admin\helpers\Storage |
extractFilesDataFromMultipleFiles() | Example Input unform: | luya\admin\helpers\Storage |
getImageResolution() | Get the image resolution of a given file path. | luya\admin\helpers\Storage |
getUploadErrorMessage() | Get the upload error message from a given $_FILES error code id. | luya\admin\helpers\Storage |
getUploadErrorMessages() | Get the file upload error messages. | luya\admin\helpers\Storage |
moveFileToFolder() | Move a storage file to another folder. | luya\admin\helpers\Storage |
moveFilesToFolder() | Move an array of storage fileIds to another folder. | luya\admin\helpers\Storage |
refreshFile() | Update the hash file sum, file size and remove image filter version from this file. | luya\admin\helpers\Storage |
removeFile() | Remove a file from the storage system. | luya\admin\helpers\Storage |
removeImage() | Remove an image from the storage system and database. | luya\admin\helpers\Storage |
replaceFile() | Replace the source of a file on the webeserver based on new and old source path informations. | luya\admin\helpers\Storage |
replaceFileFromContent() | Replace the current file based on image data | luya\admin\helpers\Storage |
uploadFromContent() | Upload a file with content | luya\admin\helpers\Storage |
uploadFromFileArray() | Add File to the storage container by providing the $_FILES array name. | luya\admin\helpers\Storage |
uploadFromFiles() | Add Files to storage component by just providing $_FILES array, used for multi file storage. | luya\admin\helpers\Storage |
Protected Methods
Method | Description | Defined By |
---|---|---|
verifyAndSaveFile() | luya\admin\helpers\Storage |
Method Details
Extract $_FILES array.
public static array extractFilesDataFromFilesArray ( array $file ) | ||
$file | array |
public static function extractFilesDataFromFilesArray(array $file)
{
if (!isset($file['tmp_name'])) {
return [];
}
$files = [];
if (is_array($file['tmp_name'])) {
foreach ($file['tmp_name'] as $index => $value) {
// skip empty or none exsting tmp file names
if (!isset($file['tmp_name'][$index]) || empty($file['tmp_name'][$index])) {
continue;
}
// create files structure array
$files[] = [
'name' => $file['name'][$index],
'type' => $file['type'][$index],
'tmp_name' => $file['tmp_name'][$index],
'error' => $file['error'][$index],
'size' => $file['size'][$index],
];
}
} elseif (isset($file['tmp_name']) && !empty($file['tmp_name'])) {
$files[] = [
'name' => $file['name'],
'type' => $file['type'],
'tmp_name' => $file['tmp_name'],
'error' => $file['error'],
'size' => $file['size'],
];
}
return $files;
}
Example Input unform:
Array
(
[name] => Array
(
[attachment] => Array
(
[0] => Altersfragen-Leimental (4).pdf
[1] => Altersfragen-Leimental (2).pdf
)
)
[type] => Array
(
[attachment] => Array
(
[0] => application/pdf
[1] => application/pdf
)
)
[tmp_name] => Array
(
[attachment] => Array
(
[0] => /tmp/phpNhqnwR
[1] => /tmp/phpbZ8XSn
)
)
[error] => Array
(
[attachment] => Array
(
[0] => 0
[1] => 0
)
)
[size] => Array
(
[attachment] => Array
(
[0] => 261726
[1] => 255335
)
)
)
to:
Array
(
[0] => Array
(
[name] => Altersfragen-Leimental (4).pdf
[type] => application/pdf
[tmp_name] => /tmp/phpNhqnwR
[error] => 0
[size] => 261726
)
[1] => Array
(
[name] => Altersfragen-Leimental (2).pdf
[type] => application/pdf
[tmp_name] => /tmp/phpbZ8XSn
[error] => 0
[size] => 255335
)
)
public static array extractFilesDataFromMultipleFiles ( array $files ) | ||
$files | array |
public static function extractFilesDataFromMultipleFiles(array $files)
{
$data = [];
$i=0;
foreach ($files as $type => $field) {
foreach ($field as $fieldName => $values) {
if (is_array($values)) {
foreach ($values as $key => $value) {
$data[$key][$type] = $value;
}
} else {
$data[$i][$type] = $values;
}
}
}
return $data;
}
Get the image resolution of a given file path.
public static array getImageResolution ( $filePath, $throwException = false ) | ||
$filePath | string | |
$throwException | boolean | |
throws | luya\Exception |
---|
public static function getImageResolution($filePath, $throwException = false)
{
$dimensions = @getimagesize(Yii::getAlias($filePath));
$width = 0;
$height = 0;
if (isset($dimensions[0]) && isset($dimensions[1])) {
$width = (int)$dimensions[0];
$height = (int)$dimensions[1];
} elseif ($throwException) {
throw new Exception("Unable to determine the resolutions of the file $filePath.");
}
return [
'width' => $width,
'height' => $height,
];
}
Get the upload error message from a given $_FILES error code id.
public static string getUploadErrorMessage ( $errorId ) | ||
$errorId | integer |
public static function getUploadErrorMessage($errorId)
{
$messagesArray = self::getUploadErrorMessages();
return $messagesArray[$errorId] ?? 'Unknown upload error.';
}
Get the file upload error messages.
public static array getUploadErrorMessages ( ) | ||
return | array |
All possible error codes when uploading files with its given message and meaning. |
---|
public static function getUploadErrorMessages()
{
return [
UPLOAD_ERR_OK => Module::t('upload_err_message_0'),
UPLOAD_ERR_INI_SIZE => Module::t('upload_err_message_1'),
UPLOAD_ERR_FORM_SIZE => Module::t('upload_err_message_2'),
UPLOAD_ERR_PARTIAL => Module::t('upload_err_message_3'),
UPLOAD_ERR_NO_FILE => Module::t('upload_err_message_4'),
UPLOAD_ERR_NO_TMP_DIR => Module::t('upload_err_message_6'),
UPLOAD_ERR_CANT_WRITE => Module::t('upload_err_message_7'),
UPLOAD_ERR_EXTENSION => Module::t('upload_err_message_8'),
];
}
Move a storage file to another folder.
public static boolean moveFileToFolder ( $fileId, $folderId ) | ||
$fileId | string|integer | |
$folderId | string|integer |
public static function moveFileToFolder($fileId, $folderId)
{
$file = StorageFile::findOne($fileId);
if ($file) {
$file->updateAttributes(['folder_id' => $folderId]);
Yii::$app->storage->flushArrays();
return true;
}
return false;
}
Move an array of storage fileIds to another folder.
public static void moveFilesToFolder ( array $fileIds, $folderId ) | ||
$fileIds | array | |
$folderId | integer |
public static function moveFilesToFolder(array $fileIds, $folderId)
{
foreach ($fileIds as $fileId) {
static::moveFileToFolder($fileId, $folderId);
}
}
Update the hash file sum, file size and remove image filter version from this file.
public static boolean refreshFile ( $fileId, $filePath ) | ||
$fileId | integer | |
$filePath |
public static function refreshFile($fileId, $filePath)
{
foreach (StorageImage::find()->where(['file_id' => $fileId])->all() as $img) {
// remove the source
if ($img->deleteSource()) {
// recreate image filters
$img->imageFilter($img->filter_id, false);
}
}
$file = StorageFile::findOne($fileId);
if (!$file) {
throw new InvalidArgumentException("Unable to find the given file.");
}
$fileHash = FileHelper::md5sum($filePath);
$fileSize = @filesize($filePath);
$file->updateAttributes([
'hash_file' => $fileHash,
'file_size' => $fileSize,
'upload_timestamp' => time(),
]);
return true;
}
Remove a file from the storage system.
public static boolean removeFile ( $fileId, $cleanup = false ) | ||
$fileId | integer |
The file id to delete |
$cleanup | boolean |
If cleanup is enabled, also all images will be deleted, this is by default turned off because casual you want to remove the large source file but not the images where used in several tables and situations. |
public static function removeFile($fileId, $cleanup = false)
{
$model = StorageFile::find()->where(['id' => $fileId, 'is_deleted' => false])->one();
if ($model) {
if ($cleanup) {
foreach (Yii::$app->storage->findImages(['file_id' => $fileId]) as $imageItem) {
StorageImage::findOne($imageItem->id)->delete();
}
}
$response = $model->delete();
Yii::$app->storage->flushArrays();
return $response;
}
return true;
}
Remove an image from the storage system and database.
public static boolean removeImage ( $imageId, $cleanup = false ) | ||
$imageId | integer |
The corresponding imageId for the {{\luya\admin\models\StorageImage}} Model to remove. |
$cleanup | boolean |
If cleanup is enabled, all other images will be deleted. Even the {{\luya\admin\models\StorageFile}} will be removed from the database and filesystem. By default cleanup is disabled and will only remove the provided $imageId itself from {{\luya\admin\models\StorageImage}}. |
public static function removeImage($imageId, $cleanup = false)
{
Yii::$app->storage->flushArrays();
$image = Yii::$app->storage->getImage($imageId);
if ($cleanup && $image) {
$fileId = $image->fileId;
foreach (Yii::$app->storage->findImages(['file_id' => $fileId]) as $imageItem) {
$storageImage = StorageImage::findOne($imageItem->id);
if ($storageImage) {
$storageImage->delete();
}
}
}
$file = StorageImage::findOne($imageId);
if ($file) {
return $file->delete();
}
return false;
}
Replace the source of a file on the webeserver based on new and old source path informations.
The replaced file will have the name of the $oldFileSource but the file will be the content of the $newFileSource.
public static boolean replaceFile ( $fileName, $newFileSource, $newFileName ) | ||
$fileName | string |
The filename identifier key in order to find the file based on the locale files system. |
$newFileSource | string |
The path to the new file which is going to have the same name as the old file e.g. |
$newFileName | string |
The new name of the file which is uploaded, mostly given from $_FILES['name'] |
return | boolean |
Whether moving was successful or not. |
---|
public static function replaceFile($fileName, $newFileSource, $newFileName)
{
try {
Yii::$app->storage->ensureFileUpload($newFileSource, $newFileName);
} catch (\Exception $e) {
return false;
}
return Yii::$app->storage->fileSystemReplaceFile($fileName, $newFileSource);
}
Replace the current file based on image data
public static boolean replaceFileFromContent ( $fileName, $newFileContent ) | ||
$fileName | string | |
$newFileContent | string |
public static function replaceFileFromContent($fileName, $newFileContent)
{
$newFileSource = @tempnam(sys_get_temp_dir(), 'replaceFromFromContent');
FileHelper::writeFile($newFileSource, $newFileContent);
try {
Yii::$app->storage->ensureFileUpload($newFileSource, $fileName);
} catch (\Exception $e) {
return false;
}
return Yii::$app->storage->fileSystemReplaceFile($fileName, $newFileSource);
}
Upload a file with content
public static luya\admin\file\Item uploadFromContent ( $content, $fileName, $folderId = 0, $isHidden = false ) | ||
$content | string | |
$fileName | string | |
$folderId | ||
$isHidden |
public static function uploadFromContent($content, $fileName, $folderId = 0, $isHidden = false)
{
$fromTempFile = @tempnam(sys_get_temp_dir(), 'uploadFromContent');
FileHelper::writeFile($fromTempFile, $content);
return Yii::$app->storage->addFile($fromTempFile, $fileName, $folderId, $isHidden);
}
Add File to the storage container by providing the $_FILES array name.
Example usage:
$return = Storage::uploadFromFileArray($_FILES['image'], 0, true);
``
Example response
```php
['upload' => false, 'message' => 'file uploaded succesfully', 'file_id' => 123], // success response example
['upload' => true, 'message' => 'No file was uploaded.', 'file_id' => 0], // error response example
public static array uploadFromFileArray ( array $fileArray, $toFolder = 0, $isHidden = false ) | ||
$fileArray | array |
Its an entry of the files array like $_FILES['logo_image']. |
$toFolder | integer |
The id of the folder the file should be uploaded to, see {{luya\admin\storage\BaseFileSystemStorage::findFolders}} |
$isHidden | string |
Whether the file should be hidden or not. |
return | array |
An array with key |
---|
public static function uploadFromFileArray(array $fileArray, $toFolder = 0, $isHidden = false)
{
$files = self::extractFilesDataFromFilesArray($fileArray);
if (count($files) !== 1) {
return ['upload' => false, 'message' => 'no image found', 'file_id' => 0];
}
return self::verifyAndSaveFile($files[0], $toFolder, $isHidden);
}
Add Files to storage component by just providing $_FILES array, used for multi file storage.
Example usage:
$return = Storage::uploadFromFiles($_FILES, 0, true);
Example response
['upload' => false, 'message' => 'file uploaded succesfully', 'file_id' => 123], // success response example
['upload' => true, 'message' => 'No file was uploaded.', 'file_id' => 0], // error response example
public static array uploadFromFiles ( array $filesArray, $toFolder = 0, $isHidden = false ) | ||
$filesArray | array |
Use $_FILES array. |
$toFolder | integer |
The id of the folder the file should be uploaded to, see {{luya\admin\storage\BaseFileSystemStorage::findFolders}} |
$isHidden | string |
Whether the file should be hidden or not. |
return | array |
An array with key |
---|
public static function uploadFromFiles(array $filesArray, $toFolder = 0, $isHidden = false)
{
$files = [];
foreach ($filesArray as $fileArrayKey => $file) {
$files = array_merge($files, self::extractFilesDataFromFilesArray($file));
}
foreach ($files as $file) {
return self::verifyAndSaveFile($file, $toFolder, $isHidden);
}
return ['upload' => false, 'message' => 'no files selected or empty files list.', 'file_id' => 0];
}
protected static array verifyAndSaveFile ( array $file, $toFolder = 0, $isHidden = false ) | ||
$file | array |
An array with the following keys available:
|
$toFolder | \luya\admin\helpers\number | |
$isHidden | string |
protected static function verifyAndSaveFile(array $file, $toFolder = 0, $isHidden = false)
{
try {
if ($file['error'] !== UPLOAD_ERR_OK) {
return ['upload' => false, 'message' => static::getUploadErrorMessage($file['error']), 'file_id' => 0];
}
$file = Yii::$app->storage->addFile($file['tmp_name'], $file['name'], $toFolder, $isHidden);
if ($file) {
return ['upload' => true, 'message' => 'file uploaded succesfully', 'file_id' => $file->id];
}
} catch (Exception $err) {
return ['upload' => false, 'message' => $err->getMessage(), 'file_id' => 0];
}
return ['upload' => false, 'message' => 'no files selected or empty files list.', 'file_id' => 0];
}