Excel 使用托管在 AWS Lambda 中的 Laravel 导入,出现错误“touch():无法创建文件,因为只读文件系统

Excel Import using Laravel Hosted in AWS Lambda giving error 'touch(): Unable to create file because Read-only file system

我正在尝试在 Laravel 中导入托管在 AWS Lambda 中的 excel sheet,但出现错误

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

看了很多文章和论坛,找到了解决方法。

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

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

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

return [

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

这是正确的,默认情况下,您的 Laravel 应用程序运行的根路径是“只读”的,Lambda 提供了一个可以执行写入操作的临时目录。

在您的情况下,解决方案就足够了,但请记住,使用“文件”驱动程序的会话和缓存等其他服务可能会遇到同样的问题。

您可以在 AppServiceProvider.php 中编写这一小段代码,以更改指向应用程序所在根文件夹的“storage_path”。

public function register()
{
  // Valid only in the production evironment.
  if ($this->app->environment('production')) {
    $this->app->instance('path.storage', '/tmp/laravel/storage');
  }
}