AWS Lambda部署的Laravel导入Excel报只读文件系统错误如何解决?
问题根因
Laravel-Excel 3.1 处理Excel导入的过程中,会独立生成临时处理文件,该临时文件的存储路径和你导入源文件的存储位置无关,默认读取config/excel.php中temporary_files.path的配置值,默认路径为storage/framework/laravel-excel。而AWS Lambda环境中/var/task(Laravel项目部署根目录)为只读文件系统,只有/tmp目录拥有读写权限,因此无论你从本地请求还是S3拉取源文件,都会触发只读路径写入报错。
解决方案
方案1:将临时文件写入Lambda可写的/tmp目录(推荐中小文件场景)
- 首先发布Laravel-Excel的配置文件,执行命令:
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
- 打开生成的
config/excel.php文件,找到temporary_files配置块,修改path参数:
'temporary_files' => [ 'path' => '/tmp', // 其余原有配置保持不变 ],
- 也可以不修改配置文件,直接在项目
.env文件中添加环境变量即可生效:
EXCEL_TEMPORARY_FILES_PATH=/tmp
- 执行配置缓存命令后重新部署项目:
php artisan config:cache
方案2:将临时文件直接写入S3(适合大文件场景,避免Lambda /tmp目录512MB容量限制)
如果你的Excel文件体积较大,超过Lambda /tmp目录的容量上限,可以直接配置临时文件存储到S3:
- 打开
config/excel.php文件,修改temporary_files配置块:
'temporary_files' => [ 'disk' => 's3', 'path' => 'storage/framework/laravel-excel', // 对应你S3桶内的存储路径 // 其余原有配置保持不变 ],
- 确认你的S3磁盘配置拥有该路径的读写权限,执行配置缓存后重新部署即可。
内容的提问来源于stack exchange,提问作者Muhammed Shihabudeen Labba A
相关产品推荐
相关产品推荐

