首页 > 解决方案 > 使用 AWS Lambda 中托管的 Laravel 导入 Excel 时出现错误“touch():无法创建文件,因为只读文件系统

问题描述

我正在尝试在 Laravel 中导入一个托管在 AWS Lambda 中的 excel 工作表,但出现错误

touch(): Unable to create file /var/task/storage/framework/laravel-excel/laravel-excel-ToQHNqV18ybdHCmqQFJKidLr5dSsWSUe.xlsx because Read-only file system

我要导入的代码是

Excel::toArray(new ClientCompanyImport, $request->file('sales_accounts_sheet'));

然后我尝试将光盘名称作为第三个参数提及为

Excel::toArray(new ClientCompanyImport, 'mysheet.xlsx', 's3');

并将 s3 存储桶路径中的“mysheet.xlsx”文件上传为“storage/frameworks/laravel-excel/mysheet.xlsx”

我仍然遇到同样的错误。正如我正确理解的那样,在此更改之后,系统正在从 S3 位置获取文件,但仍试图将文件临时保存在默认位置,即在 Lambda 中是只读的。

Laravel 版本:8 Laravel-Excel:3.1

标签: laravelamazon-web-servicesaws-lambdalaravel-8laravel-excel

解决方案


在阅读了很多文章和论坛后,我找到了解决方案。

上述错误的主要原因是由于 AWS Lambda 的只读模式。默认情况下,excel 会尝试在根文件夹中上传,在 Lambda 的情况下它是只读的,它会失败。

Lambda 支持的唯一可编辑路径是 /tmp

解决方法是在config/excel.php中指定路径

return [

'temporary_files' => [
    'local_path' => sys_get_temp_dir(),
],
.
.

推荐阅读