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

FilamentPHP FileUpload组件无法向Minio存储桶保存文件

FilamentPHP FileUpload 无法连接Minio:cURL error 7 问题排查与解决

报错信息

无法获取路径为livewire-tmp/3gV8mEXfLVdtzdvzKRuiGxHRe2Kjoj-metaSWNvbmUtQkxDLnBuZw%3D%3D-.png的文件mime_type。
[前置异常] (GuzzleHttp\Exception\ConnectException(code: 0)): cURL error 7: 无法连接到minio.cdm.local的80端口...

下面从Docker网络、配置、组件设置等维度逐一排查问题:

1. Docker容器网络连通性校验

Laravel应用与Minio同属Docker环境时,容器内部不能直接使用外部域名minio.cdm.local访问Minio,需通过Docker服务名或容器IP连通:

  • 确认Laravel和Minio服务加入同一自定义网络(避免默认bridge网络的解析问题),示例docker-compose配置:
    networks:
      app-network:
        driver: bridge
    
    services:
      laravel-app:
        # 其他配置
        networks:
          - app-network
      minio:
        # 其他配置
        networks:
          - app-network
    
  • 进入Laravel容器执行ping minio(假设Minio服务名为minio),或curl http://minio:9000验证连通性,不通则检查网络配置。

2. Laravel .env 核心配置修正

Minio的endpoint必须使用容器内部可访问地址,同时开启路径风格访问:

FILESYSTEM_DISK=s3
AWS_ACCESS_KEY_ID=你的Minio访问密钥
AWS_SECRET_ACCESS_KEY=你的Minio秘密密钥
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=你的存储桶名称
AWS_ENDPOINT=http://minio:9000  # 用Docker服务名+Minio内部端口,而非外部域名
AWS_USE_PATH_STYLE_ENDPOINT=true  # Minio强制要求开启,否则会出现虚拟主机模式404

3. Traefik 路由与端口映射检查

Traefik仅负责Minio的外部访问代理,需确保:

  • Minio容器内部端口正确暴露:
    minio:
      image: minio/minio
      command: server /data --console-address ":9001"
      ports:
        - "9000:9000"
        - "9001:9001"
    
  • Traefik路由规则指向Minio内部9000端口,而非外部80端口:
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.minio.rule=Host(`minio.cdm.local`)"
      - "traefik.http.routers.minio.entrypoints=web"
      - "traefik.http.services.minio.loadbalancer.server.port=9000"
    

4. Livewire临时存储配置调整

Filament依赖Livewire临时存储,需确保临时文件直接存到Minio,避免跨磁盘读取问题:
修改config/livewire.php:

'temporary_file_upload' => [
    'disk' => 's3', // 指定为Minio对应的磁盘名
    'rules' => ['file', 'max:10240'],
    'directory' => 'livewire-tmp',
    'middleware' => ['throttle:5,1'],
    'preview_mimes' => [
        'png', 'gif', 'bmp', 'svg', 'wav', 'mp4',
        'mov', 'avi', 'wmv', 'mp3', 'm4a',
        'jpg', 'jpeg', 'webp', 'pdf',
    ],
],

5. Minio存储桶权限校验

  • 登录Minio控制台(http://minio.cdm.local:9001),确认目标存储桶已创建,且名称与.env中AWS_BUCKET完全一致(大小写敏感)。
  • 给Laravel使用的Access Key分配该存储桶的读写权限,或临时设置存储桶为公开读写用于测试。

验证测试

先排除Filament组件影响,直接用Laravel Filesystem测试连通:

Route::get('/test-minio', function () {
    $disk = Storage::disk('s3');
    $disk->put('test.txt', 'Hello Minio!');
    return '文件上传成功:' . $disk->url('test.txt');
});

如果测试成功,再检查Filament组件是否指定了正确磁盘:

FileUpload::make('image')
    ->disk('s3')
    ->directory('uploads')
    ->required(),

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:47:26