Laravel 9大文件上传异常:超2MB时MimeType变更且无法上传
Laravel 9 + Apache 大文件上传异常问题解决
问题描述
在Laravel 9+Apache环境下,上传小于2MB的图片时一切正常,MIME类型为正确的image/jpeg;但上传超过2MB的文件(如7MB)时,MIME类型变为application/octet-stream,且无法成功上传至服务器。已配置PHP参数:
memory_limit = 32M upload_max_filesize = 24M post_max_size = 32M
前后端相关代码:
前端JS(UIkit上传)
UIkit.upload('.js-upload', { url: this.required_api.dataset.uploadProcess, multiple: true, allow : '*.jpg|jpeg|gif|png', name: 'files[]', type: 'text',... });
后端PHP(Laravel处理)
foreach ($request->file('files') as $file) { $item = $file->getClientOriginalName(); $item_name = preg_replace('/\.[^.\s]{3,4}$/', '', $item); $item_ext = $file->extension(); $filename = Str::slug($item_name); $count = MediaModel::where('file_without_ext', LIKE, "{$filename}%")->count(); if($count > 0) { $filename = $filename . '-'. ++$count; } $admin_dir = public_path('/wp-upload/admin'); $img_size_small = Image::make($file->path()); $img_size_small->resize(150, 150, function ($constraint) { $constraint->aspectRatio(); $constraint->upsize(); })->save($admin_dir.'/'.$filename.'-150x150.'.$item_ext, 100); }
解决步骤
- 修改Apache请求大小限制
Apache默认的LimitRequestBody参数通常限制为2MB(2097152字节),超过该大小的请求会被直接拦截。在Apache主配置文件(httpd.conf)或项目根目录的.htaccess中添加:
LimitRequestBody 33554432
该值对应32MB(3210241024),与PHP的post_max_size保持一致即可。
确认PHP配置实际生效
不要仅查看本地php.ini的配置内容,在Laravel项目中临时创建路由输出phpinfo(),检查upload_max_filesize、post_max_size、memory_limit的实际生效值——避免存在虚拟主机配置、额外的PHP配置文件(如php.ini-development)覆盖了你设置的参数。修正前端UIkit上传的
type参数
前端代码中设置的type: 'text'会强制上传请求使用text/plain类型,大文件上传时会导致服务器无法正确解析文件结构和类型。直接删除该参数,让UIkit默认使用multipart/form-data类型:
UIkit.upload('.js-upload', { url: this.required_api.dataset.uploadProcess, multiple: true, allow : '*.jpg|jpeg|gif|png', name: 'files[]', // 移除type: 'text'配置 ... });
- 后端增加文件有效性校验
在处理文件前先校验文件是否上传成功,避免处理损坏的临时文件:
foreach ($request->file('files') as $file) { // 先判断文件是否有效 if (!$file->isValid()) { continue; // 也可抛出异常提示用户上传失败 } // 保留后续原有逻辑 $item = $file->getClientOriginalName(); // ... }
另外,可通过PHP的finfo扩展重新检测真实MIME类型,避免依赖客户端传递的错误值:
$finfo = new \finfo(FILEINFO_MIME_TYPE); $realMimeType = $finfo->file($file->getPathname());
- 检查Laravel的文件验证规则
如果在请求验证环节设置了文件大小限制,确保最大值匹配PHP配置的上限:
// 在请求验证规则中添加或调整 'files.*' => 'required|file|image|max:24000', // 24000KB = 24MB
内容的提问来源于stack exchange,提问作者Mariusz
相关产品推荐
相关产品推荐

