Upload.php 2.17 KB
<?php
declare(strict_types=1);

namespace app\controller\admin;

use app\BaseController;
use Throwable;

/**
 * 管理后台:图片上传(与小程序 upload 存盘规则一致)
 */
class Upload extends BaseController
{
    public function image()
    {
        try {
            $file = $this->request->file('file');
            if (!$file) {
                return json(['code' => 400, 'msg' => '请选择文件(表单字段名须为 file)', 'data' => []]);
            }

            $max = 10 * 1024 * 1024;
            if ($file->getSize() > $max) {
                return json(['code' => 400, 'msg' => '文件不能超过 10MB', 'data' => []]);
            }

            $ext = strtolower((string) $file->extension());
            if ($ext === 'jpeg') {
                $ext = 'jpg';
            }
            if ($ext === '' || !in_array($ext, ['jpg', 'png', 'webp', 'gif'], true)) {
                $mime = strtolower((string) $file->getOriginalMime());
                $ext  = match (true) {
                    str_contains($mime, 'jpeg') => 'jpg',
                    str_contains($mime, 'png') => 'png',
                    str_contains($mime, 'webp') => 'webp',
                    str_contains($mime, 'gif') => 'gif',
                    default => '',
                };
            }
            if ($ext === '' || !in_array($ext, ['jpg', 'png', 'webp', 'gif'], true)) {
                return json(['code' => 400, 'msg' => '仅支持 jpg/png/webp/gif', 'data' => []]);
            }

            $subdir = date('Ymd');
            $root   = public_path() . 'uploads' . DIRECTORY_SEPARATOR . $subdir;
            if (!is_dir($root) && !mkdir($root, 0755, true) && !is_dir($root)) {
                return json(['code' => 500, 'msg' => '无法创建上传目录', 'data' => []]);
            }

            $saveName = bin2hex(random_bytes(8)) . '.' . $ext;
            $file->move($root, $saveName);

            $url = '/uploads/' . $subdir . '/' . $saveName;

            return json(['code' => 0, 'msg' => 'ok', 'data' => ['url' => $url]]);
        } catch (Throwable $e) {
            return json(['code' => 500, 'msg' => '上传失败:' . $e->getMessage(), 'data' => []]);
        }
    }
}