Laravel Livewire上传文件报422错误(多为iPhone拍摄照片)如何解决?
问题原因
这个问题是多维度限制叠加导致的,刚好命中iPhone拍摄原图的特征:iPhone原生照片体积普遍在10MB以上,且默认保存为HEIC格式,同时Heroku平台、Laravel、Livewire都有默认的上传阈值限制,裁剪后的图片体积变小、格式转为通用的JPEG/PNG,所以可以正常上传。
422错误属于请求验证失败,可按照以下方案逐步排查修复:
修复步骤
1. 调整文件验证规则
放开大小限制同时兼容HEIC格式,示例Livewire组件验证规则:
protected $rules = [ 'upload_file' => 'required|file|mimes:jpeg,png,jpg,heic|max:30720', // 最大30MB,适配Heroku单请求上限 ];
如果业务不需要保留HEIC格式,可在验证通过后调用intervention/image等图片处理包转成JPEG再上传到S3,避免前端展示兼容问题。
2. 修改Heroku PHP运行时配置
Heroku默认PHP配置的上传阈值很低,在项目根目录新建php.ini文件,添加以下配置后提交代码重新部署即可生效:
upload_max_filesize = 30M post_max_size = 30M memory_limit = 128M
3. 调整Livewire默认上传限制
Livewire默认最大上传大小为12MB,需要手动修改配置:
- 先执行命令发布Livewire配置文件:
php artisan vendor:publish --tag=livewire:config - 打开
config/livewire.php修改参数:
'upload_file_size_limit' => 30720, // 单位为KB,对应30MB
4. 可选:开启分块上传突破上限
如果业务需要上传超过30MB的文件,Heroku单请求最大30MB的限制无法绕过,可以直接开启Livewire自带的分块上传功能,只需要在上传标签上添加属性即可:
<input type="file" wire:model="upload_file" wire:chunk>
报错参考截图


内容的提问来源于stack exchange,提问作者Salar Houshvand
相关产品推荐
相关产品推荐

