本地测试都是好好的,本地Windows,服务器Linux,服务器上运行不了。
还在代码里去搜索finfo类,找不到,后面发现是扩展问题,网上搜了一下,也验证确实是fileinfo扩展没开。
但是Linux下面要开扩展,不那么容易,2H2G的阿里云表示,这个扩展安不上。
第一次用宝塔面板,也不知道是面板问题,还是什么,反正只要安这个扩展,就会死机。无奈。
以前用lnmp的时候,貌似没有这个,不过也不想换面板了,只好采用不用fileinfo的方式上传文件,安全性变低了,以后有时间还是换成oss吧。

来段代码:

try {
            // 获取配置
            $uploadConfig = Config::get('upload');
            $allowExts = $uploadConfig['allow_exts'];
            $maxSize = $uploadConfig['max_size'];
            $allowMimeTypes = $uploadConfig['mime_types'];

            // 确保$file是有效的上传文件对象
            if (!($file instanceof \think\file\UploadedFile)) {
                throw new \Exception('无效的文件对象');
            }

            // 在移动文件前获取所有需要的文件信息
            $originalName = $file->getOriginalName();
            $fileSize = $file->getSize(); // 提前获取文件大小
            $ext = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));

            // 构建验证规则(不依赖fileinfo)
            $validateRules['image'] = 'fileExt:' . implode(',', $allowExts)
                . '|fileSize:' . $maxSize;

            // 执行验证
            $validate = Validate::rule($validateRules);
            if (!$validate->check(['image' => $file])) {
                throw new ValidateException($validate->getError());
            }
            // 验证扩展名
            if (!in_array($ext, $allowExts)) {
                throw new \Exception('不支持的文件扩展名: ' . $ext);
            }

            // 构建保存路径
            $saveDir = $uploadConfig['save_path'] . date('Ymd') . '/';
            $savePath = public_path() . $saveDir;

            // 确保目录存在
            if (!is_dir($savePath)) {
                mkdir($savePath, 0755, true);
            }

            // 生成唯一文件名
            $fileName = md5(uniqid(mt_rand(), true)) . '.' . $ext;

            // 移动文件
            if (!$file->move($savePath, $fileName)) {
                throw new \Exception('文件上传失败: 移动文件发生错误!');
            }

            // 构建返回数据(使用之前获取的文件大小)
            $fileUrl = $saveDir . $fileName;

            return ResponseHelper::success([
                'url' => request()->domain() . '/' . $fileUrl,
                'filename' => $fileName,
                'size' => $fileSize // 使用提前获取的文件大小
            ]);

        } catch (\Exception $e) {
            return ResponseHelper::error(500, $e->getMessage());
        }

可以使用:

if (extension_loaded('fileinfo'))

判断是否有扩展,有的话就用扩展,没有就用上面那段处理文件。