Completed
Push — master ( 522199...324a18 )
by Dmitry
04:01
created

FileHelper::getPrefixedPath()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 3
eloc 8
c 1
b 0
f 1
nc 3
nop 4
dl 0
loc 15
ccs 0
cts 12
cp 0
crap 12
rs 9.4285
1
<?php
2
3
namespace hipanel\helpers;
4
5
use Yii;
6
use yii\base\InvalidParamException;
7
8
class FileHelper extends \yii\helpers\FileHelper
9
{
10
    /**
11
     * Returns the MIME-type of content in string
12
     * @param string $content
13
     * @return string Content mime-type
14
     */
15
    public static function getContentMimeType($content)
16
    {
17
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
18
        $mimeType = finfo_buffer($finfo, $content);
19
        finfo_close($finfo);
20
21
        return $mimeType;
22
    }
23
24
    /**
25
     * Builds path to the file $filename under the $directory with additional sub-directories.
26
     * For example, the $directory is `/var/log/yii`, the $filename is `f0527.jpg`.
27
     * Calling this method without passing optional parameters, will generate the following path:
28
     * `/var/log/yii/f0/f0527.jpg`.
29
     * Setting $nests to `2`, the path will look like `/var/log/yii/f0/52/f0527.jpg`
30
     * Setting $nests to `3` and $length to `1` you will get `/var/log/yii/f/0/5/f0527.jpg`.
31
     *
32
     * It is strongly recommended to pass only hashes as $filename in order be sure that length is enough.
33
     *
34
     * @param string $directory Path to the base directory
35
     * @param string $filename The file name
36
     * @param int $nests Number of nested directories
37
     * @param int $length Length of the nested directory name
38
     * @return string
39
     * @throws InvalidParamException filename does not contain enough characters for directory nesting
40
     */
41
    public static function getPrefixedPath($directory, $filename, $nests = 1, $length = 2)
42
    {
43
        if (strlen(basename($filename)) < $nests * $length) {
44
            throw new InvalidParamException('Filename does not contain enough characters for directory nesting');
45
        }
46
47
        for ($start = 0; $start < $nests * $length; $start += $length) {
48
            $level = substr($filename, $start, $length);
49
            $directory .= DIRECTORY_SEPARATOR . $level;
50
        }
51
52
        $directory .= DIRECTORY_SEPARATOR . $filename;
53
54
        return Yii::getAlias($directory);
55
    }
56
}
57