本地测试都是好好的,本地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'))
判断是否有扩展,有的话就用扩展,没有就用上面那段处理文件。
评论0
暂时没有评论