Подтвердить что ты не робот

Получить байтовое значение из сокращенного байтового обозначения в php.ini

Есть ли способ получить байтовые значения из строк, возвращаемых из таких функций, как ini_get('upload_max_filesize') и ini_get('post_max_size'), когда они используют сокращенное обозначение байта? Например, получите 4194304 из 4M? Я мог взломать функцию, которая делает это, но я был бы удивлен, если бы не было каких-либо построенных способов сделать это.

4b9b3361

Ответ 1

Параграф, который вы связали с, заканчивается:

Вы не можете использовать эти сокращенные обозначения вне php.ini, вместо этого используйте целочисленное значение байтов. Смотрите документацию ini_get() для пример того, как преобразовать эти значения.

Это приведет вас к чему-то вроде этого (что я немного изменил):

function return_bytes($val)
{
    $val  = trim($val);

    $last = strtolower($val[strlen($val)-1]);
    $val  = substr($val, 0, -1); // necessary since PHP 7.1; otherwise optional

    switch($last) {
        // The 'G' modifier is available since PHP 5.1.0
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }

    return $val;
}

Используйте так::

echo return_bytes("3M");
// Output: 3145728

Для выполнения этой задачи нет встроенной функции; Напомним, что, действительно, настройки INI предназначены для внутреннего использования внутри PHP. Источник PHP использует аналогичную функцию для указанного выше.

Ответ 2

Г! Просто нашел ответ на http://www.php.net/manual/en/function.ini-get.php

Просто нужно RTM...

function return_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    switch($last) {
        // The 'G' modifier is available since PHP 5.1.0
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }

    return $val;
}

Ответ 3

Я нашел много решений для решения этой проблемы, и для решения этой проблемы должна быть встроенная функция. В любом случае две вещи, чтобы выделить эту проблему:

  • Это очень специфично для значений сокращенного байта PHP, как описано здесь: http://php.net/manual/en/faq.using.php#faq.using.shorthandbytes и должно использоваться только в этом контексте.
  • Большинство современных IDE выдадут предупреждение для операторов switch без break.

Вот решение, которое охватывает все:

/**
 * Convert PHP directive values to bytes (including the shorthand syntax).
 *
 * @param string $directive The PHP directive from which to get the value from.
 *
 * @return false|int Returns the value of the directive in bytes if available, otherwise false.
 */
function php_directive_value_to_bytes($directive) {
    $value = ini_get($directive);

    // Value must be a string.
    if (!is_string($value)) {
        return false;
    }

    preg_match('/^(?<value>\d+)(?<option>[K|M|G]*)$/i', $value, $matches);

    $value = (int) $matches['value'];
    $option = strtoupper($matches['option']);

    if ($option) {
        if ($option === 'K') {
            $value *= 1024;
        } elseif ($option === 'M') {
            $value *= 1024 * 1024;
        } elseif ($option === 'G') {
            $value *= 1024 * 1024 * 1024;
        }
    }

    return $value;
}

Ответ 4

Вот один из способов.

$str=ini_get('upload_max_filesize');
preg_match('/[0-9]+/', $str, $match);

echo ($match[0] * 1024 * 1024); // <--This is MB converted to bytes