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 9flysystem-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);