2022-02-20 22:42:48 +00:00
|
|
|
|
<?php
|
|
|
|
|
// 应用公共文件
|
|
|
|
|
|
2022-04-23 09:57:29 +00:00
|
|
|
|
use think\facade\Db;
|
2022-08-23 16:27:21 +00:00
|
|
|
|
use think\facade\Lang;
|
2022-07-21 02:29:16 +00:00
|
|
|
|
use think\Response;
|
|
|
|
|
use think\facade\Config;
|
2022-07-21 03:00:46 +00:00
|
|
|
|
use app\admin\model\Config as configModel;
|
2022-07-21 02:29:16 +00:00
|
|
|
|
use think\exception\HttpResponseException;
|
2022-08-23 16:27:21 +00:00
|
|
|
|
use Symfony\Component\HttpFoundation\IpUtils;
|
2022-10-29 17:49:43 +00:00
|
|
|
|
use think\db\exception\DbException;
|
|
|
|
|
use think\db\exception\DataNotFoundException;
|
|
|
|
|
use think\db\exception\ModelNotFoundException;
|
2022-04-23 09:57:29 +00:00
|
|
|
|
|
2022-02-20 22:42:48 +00:00
|
|
|
|
if (!function_exists('path_is_writable')) {
|
|
|
|
|
/**
|
|
|
|
|
* 检查目录/文件是否可写
|
|
|
|
|
* @param $path
|
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
|
|
|
|
function path_is_writable($path): bool
|
|
|
|
|
{
|
2022-08-23 16:27:21 +00:00
|
|
|
|
if (DIRECTORY_SEPARATOR == '/' && !@ini_get('safe_mode')) {
|
2022-02-20 22:42:48 +00:00
|
|
|
|
return is_writable($path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (is_dir($path)) {
|
|
|
|
|
$path = rtrim($path, '/') . '/' . md5(mt_rand(1, 100) . mt_rand(1, 100));
|
|
|
|
|
if (($fp = @fopen($path, 'ab')) === false) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fclose($fp);
|
|
|
|
|
@chmod($path, 0777);
|
|
|
|
|
@unlink($path);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
} elseif (!is_file($path) || ($fp = @fopen($path, 'ab')) === false) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fclose($fp);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-22 07:37:55 +00:00
|
|
|
|
if (!function_exists('deldir')) {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 删除文件夹
|
|
|
|
|
* @param string $dirname 目录
|
|
|
|
|
* @param bool $delself 是否删除自身
|
|
|
|
|
* @return boolean
|
|
|
|
|
*/
|
2022-10-29 17:49:43 +00:00
|
|
|
|
function deldir(string $dirname, bool $delself = true): bool
|
2022-02-22 07:37:55 +00:00
|
|
|
|
{
|
|
|
|
|
if (!is_dir($dirname)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
$files = new RecursiveIteratorIterator(
|
2022-08-23 16:27:21 +00:00
|
|
|
|
new RecursiveDirectoryIterator($dirname, FilesystemIterator::SKIP_DOTS),
|
2022-02-22 07:37:55 +00:00
|
|
|
|
RecursiveIteratorIterator::CHILD_FIRST
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
foreach ($files as $fileinfo) {
|
|
|
|
|
if ($fileinfo->isDir()) {
|
2022-08-23 16:27:21 +00:00
|
|
|
|
deldir($fileinfo->getRealPath());
|
2022-02-22 07:37:55 +00:00
|
|
|
|
} else {
|
|
|
|
|
@unlink($fileinfo->getRealPath());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ($delself) {
|
|
|
|
|
@rmdir($dirname);
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-02 21:20:19 +00:00
|
|
|
|
if (!function_exists('del_empty_dir')) {
|
|
|
|
|
/**
|
|
|
|
|
* 删除一个路径下的所有相对空文件夹(删除此路径中的所有空文件夹)
|
|
|
|
|
* @param string $path 相对于根目录的文件夹路径,如 c:BuildAdmin/a/b/
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
function del_empty_dir(string $path)
|
|
|
|
|
{
|
|
|
|
|
$path = str_replace(root_path(), '', trim(path_transform($path), DIRECTORY_SEPARATOR));
|
|
|
|
|
$path = array_filter(explode(DIRECTORY_SEPARATOR, $path));
|
|
|
|
|
for ($i = count($path) - 1; $i >= 0; $i--) {
|
|
|
|
|
$dirPath = root_path() . implode(DIRECTORY_SEPARATOR, $path);
|
|
|
|
|
if (!is_dir($dirPath)) {
|
|
|
|
|
unset($path[$i]);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (dir_is_empty($dirPath)) {
|
|
|
|
|
deldir($dirPath);
|
|
|
|
|
unset($path[$i]);
|
|
|
|
|
} else {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-15 04:02:19 +00:00
|
|
|
|
if (!function_exists('dir_is_empty')) {
|
|
|
|
|
function dir_is_empty(string $dir): bool
|
|
|
|
|
{
|
|
|
|
|
$handle = opendir($dir);
|
|
|
|
|
while (false !== ($entry = readdir($handle))) {
|
|
|
|
|
if ($entry != "." && $entry != "..") {
|
|
|
|
|
closedir($handle);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
closedir($handle);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-20 22:42:48 +00:00
|
|
|
|
if (!function_exists('__')) {
|
2022-03-13 13:23:43 +00:00
|
|
|
|
/**
|
|
|
|
|
* 语言翻译
|
|
|
|
|
* @param string $name 被翻译字符
|
|
|
|
|
* @param array $vars 替换字符数组
|
|
|
|
|
* @param string $lang 翻译语言
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
2022-02-20 22:42:48 +00:00
|
|
|
|
function __(string $name, array $vars = [], string $lang = '')
|
|
|
|
|
{
|
|
|
|
|
if (is_numeric($name) || !$name) {
|
|
|
|
|
return $name;
|
|
|
|
|
}
|
2022-08-23 16:27:21 +00:00
|
|
|
|
return Lang::get($name, $vars, $lang);
|
2022-02-20 22:42:48 +00:00
|
|
|
|
}
|
2022-03-01 16:24:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-03-30 16:37:59 +00:00
|
|
|
|
if (!function_exists('get_sys_config')) {
|
2022-06-25 03:31:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* 获取站点的系统配置,不传递参数则获取所有配置项
|
|
|
|
|
* @param string $name 变量名
|
|
|
|
|
* @param string $group 变量分组,传递此参数来获取某个分组的所有配置项
|
|
|
|
|
* @param bool $reduct 是否开启简洁模式,简洁模式下,获取多项配置时只返回配置的键值对
|
|
|
|
|
* @return string | array
|
2022-10-29 17:49:43 +00:00
|
|
|
|
* @throws DataNotFoundException
|
|
|
|
|
* @throws DbException
|
|
|
|
|
* @throws ModelNotFoundException
|
2022-06-25 03:31:02 +00:00
|
|
|
|
*/
|
2022-10-29 17:49:43 +00:00
|
|
|
|
function get_sys_config(string $name = '', string $group = '', bool $reduct = true)
|
2022-03-30 16:37:59 +00:00
|
|
|
|
{
|
|
|
|
|
if ($name) {
|
2022-06-25 03:31:02 +00:00
|
|
|
|
// 直接使用->value('value')不能使用到模型的类型格式化
|
2022-07-21 03:00:46 +00:00
|
|
|
|
$config = configModel::cache($name, null, configModel::$cacheTag)->where('name', $name)->find();
|
2022-06-25 03:31:02 +00:00
|
|
|
|
if ($config) $config = $config['value'];
|
2022-03-30 16:37:59 +00:00
|
|
|
|
} else {
|
2022-06-25 03:31:02 +00:00
|
|
|
|
if ($group) {
|
2022-07-21 03:00:46 +00:00
|
|
|
|
$temp = configModel::cache('group' . $group, null, configModel::$cacheTag)->where('group', $group)->select()->toArray();
|
2022-06-25 03:31:02 +00:00
|
|
|
|
} else {
|
2022-07-21 03:00:46 +00:00
|
|
|
|
$temp = configModel::cache('sys_config_all', null, configModel::$cacheTag)->order('weigh desc')->select()->toArray();
|
2022-06-25 03:31:02 +00:00
|
|
|
|
}
|
|
|
|
|
if ($reduct) {
|
|
|
|
|
$config = [];
|
|
|
|
|
foreach ($temp as $item) {
|
|
|
|
|
$config[$item['name']] = $item['value'];
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
$config = $temp;
|
|
|
|
|
}
|
2022-03-30 16:37:59 +00:00
|
|
|
|
}
|
2022-06-25 03:31:02 +00:00
|
|
|
|
return $config;
|
2022-03-30 16:37:59 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-01 16:24:27 +00:00
|
|
|
|
if (!function_exists('get_route_remark')) {
|
2022-03-13 13:23:43 +00:00
|
|
|
|
/**
|
|
|
|
|
* 获取当前路由后台菜单规则的备注信息
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
2022-03-01 16:24:27 +00:00
|
|
|
|
function get_route_remark()
|
|
|
|
|
{
|
|
|
|
|
$controllername = request()->controller(true);
|
|
|
|
|
$actionname = request()->action(true);
|
2022-03-17 16:09:51 +00:00
|
|
|
|
$path = str_replace('.', '/', $controllername);
|
|
|
|
|
|
2022-08-23 16:27:21 +00:00
|
|
|
|
$remark = Db::name('menu_rule')
|
2022-03-17 16:09:51 +00:00
|
|
|
|
->where('name', $path)
|
|
|
|
|
->whereOr('name', $path . '/' . $actionname)
|
|
|
|
|
->value('remark');
|
2022-05-07 14:37:58 +00:00
|
|
|
|
return __((string)$remark);
|
2022-03-01 16:24:27 +00:00
|
|
|
|
}
|
2022-03-11 17:29:06 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!function_exists('full_url')) {
|
|
|
|
|
/**
|
|
|
|
|
* 获取资源完整url地址
|
|
|
|
|
* @param string $relativeUrl 资源相对地址 不传入则获取域名
|
|
|
|
|
* @param boolean $domain 是否携带域名 或者直接传入域名
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
2022-10-29 17:49:43 +00:00
|
|
|
|
function full_url(string $relativeUrl = '', bool $domain = true, $default = '')
|
2022-03-11 17:29:06 +00:00
|
|
|
|
{
|
2022-08-03 03:34:42 +00:00
|
|
|
|
$cdnUrl = Config::get('buildadmin.cdn_url');
|
2022-09-18 07:19:18 +00:00
|
|
|
|
if (!$cdnUrl) $cdnUrl = request()->upload['cdn'] ?? request()->domain();
|
2022-08-03 03:34:42 +00:00
|
|
|
|
if ($domain === true) {
|
2022-09-18 07:19:18 +00:00
|
|
|
|
$domain = $cdnUrl;
|
2022-08-03 03:34:42 +00:00
|
|
|
|
} elseif ($domain === false) {
|
|
|
|
|
$domain = '';
|
2022-03-11 17:29:06 +00:00
|
|
|
|
}
|
2022-08-03 03:34:42 +00:00
|
|
|
|
|
2022-08-23 16:27:21 +00:00
|
|
|
|
$relativeUrl = $relativeUrl ?: $default;
|
2022-08-03 03:34:42 +00:00
|
|
|
|
if (!$relativeUrl) return $domain;
|
|
|
|
|
|
2022-03-11 17:29:06 +00:00
|
|
|
|
$regex = "/^((?:[a-z]+:)?\/\/|data:image\/)(.*)/i";
|
|
|
|
|
if (preg_match('/^http(s)?:\/\//', $relativeUrl) || preg_match($regex, $relativeUrl) || $domain === false) {
|
|
|
|
|
return $relativeUrl;
|
|
|
|
|
}
|
2022-08-03 03:34:42 +00:00
|
|
|
|
return $domain . $relativeUrl;
|
2022-03-11 17:29:06 +00:00
|
|
|
|
}
|
2022-03-13 13:23:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-19 16:07:34 +00:00
|
|
|
|
if (!function_exists('encrypt_password')) {
|
|
|
|
|
/**
|
|
|
|
|
* 加密密码
|
|
|
|
|
*/
|
|
|
|
|
function encrypt_password($password, $salt = '', $encrypt = 'md5')
|
|
|
|
|
{
|
|
|
|
|
return $encrypt($encrypt($password) . $salt);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!function_exists('action_in_arr')) {
|
|
|
|
|
/**
|
|
|
|
|
* 检测一个方法是否在传递的数组内
|
2022-10-29 17:49:43 +00:00
|
|
|
|
* @param array $arr
|
2022-06-19 16:07:34 +00:00
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
2022-10-29 17:49:43 +00:00
|
|
|
|
function action_in_arr(array $arr = []): bool
|
2022-06-19 16:07:34 +00:00
|
|
|
|
{
|
|
|
|
|
$arr = is_array($arr) ? $arr : explode(',', $arr);
|
|
|
|
|
if (!$arr) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
$arr = array_map('strtolower', $arr);
|
|
|
|
|
if (in_array(strtolower(request()->action()), $arr) || in_array('*', $arr)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-13 13:23:43 +00:00
|
|
|
|
if (!function_exists('build_suffix_svg')) {
|
|
|
|
|
/**
|
|
|
|
|
* 构建文件后缀的svg图片
|
2022-10-29 17:49:43 +00:00
|
|
|
|
* @param string $suffix 文件后缀
|
|
|
|
|
* @param string|null $background 背景颜色,如:rgb(255,255,255)
|
2022-03-13 13:23:43 +00:00
|
|
|
|
* @return string
|
|
|
|
|
*/
|
2022-10-29 17:49:43 +00:00
|
|
|
|
function build_suffix_svg(string $suffix = 'file', string $background = null): string
|
2022-03-13 13:23:43 +00:00
|
|
|
|
{
|
|
|
|
|
$suffix = mb_substr(strtoupper($suffix), 0, 4);
|
|
|
|
|
$total = unpack('L', hash('adler32', $suffix, true))[1];
|
|
|
|
|
$hue = $total % 360;
|
|
|
|
|
[$r, $g, $b] = hsv2rgb($hue / 360, 0.3, 0.9);
|
|
|
|
|
|
2022-10-29 17:49:43 +00:00
|
|
|
|
$background = $background ?: "rgb($r,$g,$b)";
|
2022-03-13 13:23:43 +00:00
|
|
|
|
|
2022-08-23 16:27:21 +00:00
|
|
|
|
return '<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
2022-03-13 13:23:43 +00:00
|
|
|
|
<path style="fill:#E2E5E7;" d="M128,0c-17.6,0-32,14.4-32,32v448c0,17.6,14.4,32,32,32h320c17.6,0,32-14.4,32-32V128L352,0H128z"/>
|
|
|
|
|
<path style="fill:#B0B7BD;" d="M384,128h96L352,0v96C352,113.6,366.4,128,384,128z"/>
|
|
|
|
|
<polygon style="fill:#CAD1D8;" points="480,224 384,128 480,128 "/>
|
|
|
|
|
<path style="fill:' . $background . ';" d="M416,416c0,8.8-7.2,16-16,16H48c-8.8,0-16-7.2-16-16V256c0-8.8,7.2-16,16-16h352c8.8,0,16,7.2,16,16 V416z"/>
|
|
|
|
|
<path style="fill:#CAD1D8;" d="M400,432H96v16h304c8.8,0,16-7.2,16-16v-16C416,424.8,408.8,432,400,432z"/>
|
|
|
|
|
<g><text><tspan x="220" y="380" font-size="124" font-family="Verdana, Helvetica, Arial, sans-serif" fill="white" text-anchor="middle">' . $suffix . '</tspan></text></g>
|
|
|
|
|
</svg>';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-23 09:57:29 +00:00
|
|
|
|
if (!function_exists('get_area')) {
|
|
|
|
|
function get_area()
|
|
|
|
|
{
|
2022-08-23 16:27:21 +00:00
|
|
|
|
$province = request()->get('province', '');
|
|
|
|
|
$city = request()->get('city', '');
|
|
|
|
|
$where = ['pid' => 0, 'level' => 1];
|
2022-04-23 09:57:29 +00:00
|
|
|
|
if ($province !== '') {
|
|
|
|
|
$where['pid'] = $province;
|
|
|
|
|
$where['level'] = 2;
|
|
|
|
|
if ($city !== '') {
|
|
|
|
|
$where['pid'] = $city;
|
|
|
|
|
$where['level'] = 3;
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-08-23 16:27:21 +00:00
|
|
|
|
return Db::name('area')->where($where)->field('id as value,name as label')->select();
|
2022-04-23 09:57:29 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-13 13:23:43 +00:00
|
|
|
|
if (!function_exists('hsv2rgb')) {
|
2022-10-29 17:49:43 +00:00
|
|
|
|
function hsv2rgb($h, $s, $v): array
|
2022-03-13 13:23:43 +00:00
|
|
|
|
{
|
|
|
|
|
$r = $g = $b = 0;
|
|
|
|
|
|
|
|
|
|
$i = floor($h * 6);
|
|
|
|
|
$f = $h * 6 - $i;
|
|
|
|
|
$p = $v * (1 - $s);
|
|
|
|
|
$q = $v * (1 - $f * $s);
|
|
|
|
|
$t = $v * (1 - (1 - $f) * $s);
|
|
|
|
|
|
|
|
|
|
switch ($i % 6) {
|
|
|
|
|
case 0:
|
|
|
|
|
$r = $v;
|
|
|
|
|
$g = $t;
|
|
|
|
|
$b = $p;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
$r = $q;
|
|
|
|
|
$g = $v;
|
|
|
|
|
$b = $p;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
$r = $p;
|
|
|
|
|
$g = $v;
|
|
|
|
|
$b = $t;
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
$r = $p;
|
|
|
|
|
$g = $q;
|
|
|
|
|
$b = $v;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
$r = $t;
|
|
|
|
|
$g = $p;
|
|
|
|
|
$b = $v;
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
$r = $v;
|
|
|
|
|
$g = $p;
|
|
|
|
|
$b = $q;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
floor($r * 255),
|
|
|
|
|
floor($g * 255),
|
|
|
|
|
floor($b * 255)
|
|
|
|
|
];
|
|
|
|
|
}
|
2022-07-21 02:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!function_exists('ip_check')) {
|
|
|
|
|
function ip_check($ip = null)
|
|
|
|
|
{
|
|
|
|
|
$ip = is_null($ip) ? request()->ip() : $ip;
|
|
|
|
|
$noAccess = get_sys_config('no_access_ip');
|
|
|
|
|
$noAccess = !$noAccess ? [] : array_filter(explode("\n", str_replace("\r\n", "\n", $noAccess)));
|
2022-08-23 16:27:21 +00:00
|
|
|
|
if ($noAccess && IpUtils::checkIp($ip, $noAccess)) {
|
2022-07-21 02:29:16 +00:00
|
|
|
|
$response = Response::create(['msg' => 'No permission request'], 'json', 403);
|
|
|
|
|
throw new HttpResponseException($response);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!function_exists('set_timezone')) {
|
|
|
|
|
function set_timezone($timezone = null)
|
|
|
|
|
{
|
|
|
|
|
$defaultTimezone = Config::get('app.default_timezone');
|
|
|
|
|
$timezone = is_null($timezone) ? get_sys_config('time_zone') : $timezone;
|
|
|
|
|
if ($timezone && $defaultTimezone != $timezone) {
|
|
|
|
|
Config::set([
|
|
|
|
|
'app.default_timezone' => $timezone
|
|
|
|
|
]);
|
|
|
|
|
date_default_timezone_set($timezone);
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-09-02 11:54:56 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!function_exists('path_transform')) {
|
|
|
|
|
function path_transform(string $path)
|
|
|
|
|
{
|
|
|
|
|
return str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $path);
|
|
|
|
|
}
|
2022-09-17 15:30:21 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!function_exists('get_upload_config')) {
|
|
|
|
|
function get_upload_config()
|
|
|
|
|
{
|
2022-09-17 17:05:00 +00:00
|
|
|
|
$uploadConfig = Config::get('upload');
|
|
|
|
|
$uploadConfig['maxsize'] = file_unit_to_byte($uploadConfig['maxsize']);
|
|
|
|
|
|
|
|
|
|
$upload = request()->upload;
|
2022-09-17 15:30:21 +00:00
|
|
|
|
if (!$upload) {
|
|
|
|
|
$uploadConfig['mode'] = 'local';
|
|
|
|
|
return $uploadConfig;
|
|
|
|
|
}
|
2022-09-18 07:19:18 +00:00
|
|
|
|
unset($upload['cdn']);
|
2022-09-17 15:30:21 +00:00
|
|
|
|
return array_merge($upload, $uploadConfig);
|
|
|
|
|
}
|
2022-09-17 16:46:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!function_exists('file_unit_to_byte')) {
|
|
|
|
|
/**
|
|
|
|
|
* 将一个文件单位转为字节
|
|
|
|
|
* @param string $unit 将b、kb、m、mb、g、gb的单位转为 byte
|
|
|
|
|
*/
|
|
|
|
|
function file_unit_to_byte(string $unit): int
|
|
|
|
|
{
|
|
|
|
|
preg_match('/([0-9\.]+)(\w+)/', $unit, $matches);
|
|
|
|
|
if (!$matches) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
$typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3];
|
|
|
|
|
return (int)($matches[1] * pow(1024, $typeDict[strtolower($matches[2])] ?? 0));
|
|
|
|
|
}
|
2022-02-20 22:42:48 +00:00
|
|
|
|
}
|