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