Laravel 无法连接到 AWS S3
Laravel can't connect to AWS S3
我已经设置了一个 S3 存储桶并创建了一个具有完全 S3 访问权限的 IAM 用户,并且 运行 composer require league/flysystem-aws-s3-v3
.
我还在.env中配置了以下内容:
AWS_ACCESS_KEY_ID=XXXX
AWS_SECRET_ACCESS_KEY=YYYY
AWS_DEFAULT_REGION=us-west-3
AWS_BUCKET=my-bucket
AWS_USE_PATH_STYLE_ENDPOINT=false
FILESYSTEM_DRIVER=s3
问题是我根本无法从我的控制器与 S3 交互。
我试过将文件发送到 S3:
$path = $request->Image->store('images', 's3');
我也手动上传了一张图片到S3,然后尝试检查它是否可以找到它:
if (Storage::disk('s3')->exists('photo.jpg')) {
dd("file found");
} else{
dd("file not found");
}
这会导致此错误:Unable to check existence for: photo.jpg
这让我认为问题出在 flysystem-aws-s3-v3
。
有没有办法缩小问题所在的范围?顺便说一句,如果有帮助,我正在使用 Laravel 9 和 flysystem-aws-s3-v3 3.0。
看起来你做对了一切! .. 它是否适用于 local
驱动器?
您也可以尝试刷新缓存:
php artisan cache:clear
php artisan config:clear
终于找到连接不上的原因了。
这是 .env 文件的样子:
//some env vars
AWS_ACCESS_KEY_ID=XXXX
AWS_SECRET_ACCESS_KEY=YYYY
AWS_DEFAULT_REGION=us-west-3
AWS_BUCKET=my-bucket
AWS_USE_PATH_STYLE_ENDPOINT=false
FILESYSTEM_DRIVER=s3
//many other env vars
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=
事实证明 Laravel(或者可能是 Flysystem?)已经配置了相同的 S3 变量并将值留空。所以我的环境变量被这些空变量覆盖,导致连接失败。
我想这里要吸取的教训是始终检查整个 .env 文件是否包含多个具有相同密钥的变量。
奖金
使用 Laravel 设置 S3 后,您可以使用这些片段来:
- 将图像保存到您的 S3 存储桶:
Storage::disk('s3')->put($newImagePath, file_get_contents($imageName));
//make sure to include the extension of the image in the $imageName, to do that, use $Image->extension()
- 从您的 S3 存储桶中获取图像:
$image = Storage::disk('s3')->temporaryUrl($imagePath, Carbon::now()->addMinutes(20)); //tip: if you get a squiggly line on tempraryUrl(), it's just Intelephense shenanigans, you can just ignore it or remove it using https://github.com/barryvdh/laravel-ide-helper
//This will generate a temporary link that your Blade file can use to access an image, this link will last for 20 minutes.
//This will work even with S3 images stored with Private visibility.
//In your blade file:
<img src="{{$image}}">
- 检查您的 S3 存储桶中是否存在图像:
if (Storage::disk('s3')->exists($imagePath)) { //make sure to include the full path to the image file in $imagePath
//do stuff
}
- 从您的 S3 存储桶中删除图像:
Storage::disk('s3')->delete($imagePath);
我已经设置了一个 S3 存储桶并创建了一个具有完全 S3 访问权限的 IAM 用户,并且 运行 composer require league/flysystem-aws-s3-v3
.
我还在.env中配置了以下内容:
AWS_ACCESS_KEY_ID=XXXX
AWS_SECRET_ACCESS_KEY=YYYY
AWS_DEFAULT_REGION=us-west-3
AWS_BUCKET=my-bucket
AWS_USE_PATH_STYLE_ENDPOINT=false
FILESYSTEM_DRIVER=s3
问题是我根本无法从我的控制器与 S3 交互。 我试过将文件发送到 S3:
$path = $request->Image->store('images', 's3');
我也手动上传了一张图片到S3,然后尝试检查它是否可以找到它:
if (Storage::disk('s3')->exists('photo.jpg')) {
dd("file found");
} else{
dd("file not found");
}
这会导致此错误:Unable to check existence for: photo.jpg
这让我认为问题出在 flysystem-aws-s3-v3
。
有没有办法缩小问题所在的范围?顺便说一句,如果有帮助,我正在使用 Laravel 9 和 flysystem-aws-s3-v3 3.0。
看起来你做对了一切! .. 它是否适用于 local
驱动器?
您也可以尝试刷新缓存:
php artisan cache:clear
php artisan config:clear
终于找到连接不上的原因了。 这是 .env 文件的样子:
//some env vars
AWS_ACCESS_KEY_ID=XXXX
AWS_SECRET_ACCESS_KEY=YYYY
AWS_DEFAULT_REGION=us-west-3
AWS_BUCKET=my-bucket
AWS_USE_PATH_STYLE_ENDPOINT=false
FILESYSTEM_DRIVER=s3
//many other env vars
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=
事实证明 Laravel(或者可能是 Flysystem?)已经配置了相同的 S3 变量并将值留空。所以我的环境变量被这些空变量覆盖,导致连接失败。 我想这里要吸取的教训是始终检查整个 .env 文件是否包含多个具有相同密钥的变量。
奖金
使用 Laravel 设置 S3 后,您可以使用这些片段来:
- 将图像保存到您的 S3 存储桶:
Storage::disk('s3')->put($newImagePath, file_get_contents($imageName));
//make sure to include the extension of the image in the $imageName, to do that, use $Image->extension()
- 从您的 S3 存储桶中获取图像:
$image = Storage::disk('s3')->temporaryUrl($imagePath, Carbon::now()->addMinutes(20)); //tip: if you get a squiggly line on tempraryUrl(), it's just Intelephense shenanigans, you can just ignore it or remove it using https://github.com/barryvdh/laravel-ide-helper
//This will generate a temporary link that your Blade file can use to access an image, this link will last for 20 minutes.
//This will work even with S3 images stored with Private visibility.
//In your blade file:
<img src="{{$image}}">
- 检查您的 S3 存储桶中是否存在图像:
if (Storage::disk('s3')->exists($imagePath)) { //make sure to include the full path to the image file in $imagePath
//do stuff
}
- 从您的 S3 存储桶中删除图像:
Storage::disk('s3')->delete($imagePath);