Импорт Excel с помощью Laravel, размещенного в AWS Lambda, выдает ошибку » touch(): Не удалось создать файл, поскольку файловая система доступна только для чтения

#laravel #amazon-web-services #aws-lambda #laravel-8 #laravel-excel

Вопрос:

Я пытаюсь импортировать лист excel в Laravel, размещенный в AWS Lambda, и получаю ошибку

 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');
 

и загрузил ‘mysheet.xlsx» файл в пути к корзине s3 как «storage/frameworks/laravel-excel/mysheet.xlsx’

Тем не менее, я получаю ту же ошибку. Как я правильно понимаю, после этого изменения система получает файл из расположения S3, но все еще пытается сохранить файл временным в расположении по умолчанию, то есть только для чтения в Лямбде.

Версия Laravel: 8 Laravel-Excel: 3.1

Ответ №1:

Прочитав множество статей и форумов, я нашел решение.

Основная причина вышеуказанной ошибки связана с режимом только для чтения AWS Lambda. По умолчанию excel пытается загрузить в корневую папку, то есть только для чтения в случае Lambda, и это не удается.

Единственным редактируемым путем, поддерживаемым Лямбда, является /tmp

Решение состоит в том, чтобы указать путь в config/excel.php

 return [

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

Ответ №2:

Это правильно, по умолчанию корневой путь, по которому запускается ваше приложение Laravel, «доступен только для чтения», Lambda предоставляет временный каталог, в котором можно выполнять операции записи.

В вашем случае решение является адекватным, но имейте в виду, что у вас может возникнуть та же проблема с другими службами, такими как сеанс и кэш, с помощью драйвера «файл».

Вы можете написать этот небольшой блок кода внутри себя AppServiceProvider.php , чтобы изменить «путь к хранилищу», который указывает на корневую папку, в которой находится ваше приложение.

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