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
相关产品推荐
相关产品推荐

