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

Laravel 5多份大文件上传至S3遇阻,求解决方案

解决Laravel 5上传大文件到S3的问题

我来帮你排查这个问题,大文件上传到S3确实需要注意几个关键点——你改了upload_max_filesize但没解决,大概率是还有其他配置没跟上,或者上传方式需要调整。下面一步步来解决:

第一步:补全PHP的关键配置

除了upload_max_filesize = 50M,你还需要确保以下PHP配置也调整到位(修改后记得重启Web服务器):

  • post_max_size = 60M:这个值必须大于upload_max_filesize,因为POST请求的总大小包含文件和其他表单数据
  • max_execution_time = 300:延长脚本执行时间,避免大文件上传中途超时
  • max_input_time = 300:允许脚本接收输入的时间更长
  • memory_limit = 128M:确保脚本有足够内存处理大文件

如果用的是Nginx服务器,还要额外检查Nginx配置文件,添加或修改client_max_body_size 60M;,否则Nginx会在PHP处理前就拦截大文件请求。

第二步:优化上传代码

你的流上传方式对于超大文件可能不够稳定,推荐两种更可靠的方案:

方案1:用Laravel原生方法简化上传

Laravel的putFileAs会自动处理文件上传逻辑,包括大文件,代码更简洁:

foreach ($request->file('photos') as $file) {
    $filename = $file->getClientOriginalName();
    // S3路径不需要开头的斜杠,改成uploads/更规范
    $filePath = 'uploads/' . $filename;
    \Storage::disk('s3')->putFileAs('uploads', $file, $filename);
}

方案2:手动实现分块上传(适合超大文件)

如果文件超过100M,分块上传能避免中途断开的问题,直接调用AWS SDK的MultipartUploader:

use Aws\S3\MultipartUploader;
use Aws\Exception\MultipartUploadException;

foreach ($request->file('photos') as $file) {
    $filename = $file->getClientOriginalName();
    $filePath = 'uploads/' . $filename;
    
    // 获取S3客户端实例
    $s3 = \Storage::disk('s3')->getDriver()->getAdapter()->getClient();
    
    $uploader = new MultipartUploader($s3, $file->getRealPath(), [
        'bucket' => env('AWS_BUCKET'),
        'key' => $filePath,
        'part_size' => 10 * 1024 * 1024, // 每块10M,可根据需求调整
    ]);

    try {
        $result = $uploader->upload();
        // 上传成功后可以记录URL或做其他处理
        // echo "上传成功:{$result['ObjectURL']}";
    } catch (MultipartUploadException $e) {
        // 处理上传失败的情况
        // echo "上传失败:" . $e->getMessage();
    }
}

第三步:确认Laravel文件系统配置

检查config/filesystems.php中的S3配置是否正确,确保没有额外的大小限制:

'disks' => [
    // ...其他磁盘配置
    's3' => [
        'driver' => 's3',
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'region' => env('AWS_DEFAULT_REGION'),
        'bucket' => env('AWS_BUCKET'),
        'url' => env('AWS_URL'),
        'endpoint' => env('AWS_ENDPOINT'),
        'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
    ],
],

按照这些步骤调整后,应该就能顺利上传大文件到S3了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:24:44