You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

解决步骤

  1. 修改Apache请求大小限制
    Apache默认的LimitRequestBody参数通常限制为2MB(2097152字节),超过该大小的请求会被直接拦截。在Apache主配置文件(httpd.conf)或项目根目录的.htaccess中添加:
LimitRequestBody 33554432

该值对应32MB(3210241024),与PHP的post_max_size保持一致即可。

  1. 确认PHP配置实际生效
    不要仅查看本地php.ini的配置内容,在Laravel项目中临时创建路由输出phpinfo(),检查upload_max_filesize、post_max_size、memory_limit的实际生效值——避免存在虚拟主机配置、额外的PHP配置文件(如php.ini-development)覆盖了你设置的参数。

  2. 修正前端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'配置
    ...
});
  1. 后端增加文件有效性校验
    在处理文件前先校验文件是否上传成功,避免处理损坏的临时文件:
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());
  1. 检查Laravel的文件验证规则
    如果在请求验证环节设置了文件大小限制,确保最大值匹配PHP配置的上限:
// 在请求验证规则中添加或调整
'files.*' => 'required|file|image|max:24000', // 24000KB = 24MB

内容的提问来源于stack exchange,提问作者Mariusz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:48:25