从 Laravel Nova 下载存储在 AWS S3 中的文件导致错误
Download files stored in AWS S3 from Laravel Nova results in bug
我们在 Laravel 应用程序中将 Nova 包用于我们的管理后端。所有文件和图像都存储在 AWS S3 存储桶中。
尝试从 Nova 下载文件后,下载以名称 download.json 和服务器错误消息开始。
文件正确存储在S3中,我可以手动检查,S3中文件的路径也正确存储在数据库中。
这是我们用来在 Nova 中创建下载字段的代码
->download(function(){
return Storage::disk('s3')->download($this->name);
})
->onlyOnDetail()
$this->name 包含 s3 存储桶内的路径。
config/filesystems.php也定义为:
'disks' => [
...
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
],
Nova 文档没有帮助我解决这个问题。任何输入都会非常有帮助。
更新:
问题不在代码中,而在配置中。
在不更改配置的情况下,以下代码确实有所帮助:
Text::make('File/Document', function() {
$linkToFile = Storage::disk('s3')->temporaryUrl($this->name, now()->addMinutes(1));
return '<a href="' . $linkToFile . '" target="_blank">Download file</a>';
})
->asHtml(),
如果没有看到完整的功能,很难看出任何问题,但请确保您的名称 属性 $this->name
与您的远程文件 'key' 具有相同的值,如您的 Amazon s3 中所示桶.
此外,请确保您的 .env
文件正确并包含以下值:
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_access_key
AWS_DEFAULT_REGION=your_default_region
AWS_BUCKET=your_bucket_name
AWS_URL=your_url #if applicable
希望这是有道理的。
编辑:还有一件事,在 filesystem.php
这一行:
'url' => env('AWS_URL'),
在 Laravel 6.x 中根据 this bug 更改为:
'endpoint' => env('AWS_URL'),
我们在 Laravel 应用程序中将 Nova 包用于我们的管理后端。所有文件和图像都存储在 AWS S3 存储桶中。
尝试从 Nova 下载文件后,下载以名称 download.json 和服务器错误消息开始。
文件正确存储在S3中,我可以手动检查,S3中文件的路径也正确存储在数据库中。
这是我们用来在 Nova 中创建下载字段的代码
->download(function(){
return Storage::disk('s3')->download($this->name);
})
->onlyOnDetail()
$this->name 包含 s3 存储桶内的路径。
config/filesystems.php也定义为:
'disks' => [
...
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
],
Nova 文档没有帮助我解决这个问题。任何输入都会非常有帮助。
更新: 问题不在代码中,而在配置中。 在不更改配置的情况下,以下代码确实有所帮助:
Text::make('File/Document', function() {
$linkToFile = Storage::disk('s3')->temporaryUrl($this->name, now()->addMinutes(1));
return '<a href="' . $linkToFile . '" target="_blank">Download file</a>';
})
->asHtml(),
如果没有看到完整的功能,很难看出任何问题,但请确保您的名称 属性 $this->name
与您的远程文件 'key' 具有相同的值,如您的 Amazon s3 中所示桶.
此外,请确保您的 .env
文件正确并包含以下值:
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_access_key
AWS_DEFAULT_REGION=your_default_region
AWS_BUCKET=your_bucket_name
AWS_URL=your_url #if applicable
希望这是有道理的。
编辑:还有一件事,在 filesystem.php
这一行:
'url' => env('AWS_URL'),
在 Laravel 6.x 中根据 this bug 更改为:
'endpoint' => env('AWS_URL'),