在 Laravel 中上传后将 aws s3 文件权限设置为公开

Wai*_*ein 1 amazon-s3 amazon-web-services laravel

我正在开发一个网络应用程序。在我的应用程序中,我正在实现文件上传功能。我将上传的文件存储在 aws s3 存储桶中。我将文件上传到 s3 存储桶,如下所示。

 $photo_file_path = $request->file('image_file')->store(
            'images/artworks/gallery-images/'.uniqid(),  's3'
          );
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常。文件上传到s3。但问题是我希望文件在上传到 s3 时是公开的,这样照片也可以从 url 访问。我将存储桶策略和访问控制都设置为 public。

这是我的存储桶策略

{
    "Version": "2012-10-17",
    "Id": "Policy1234566788",
    "Statement": [
        {
            "Sid": "Stmt151234344545",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my-bucket"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我的存储桶现在对于访问控制和存储桶策略都是公开的。 在此处输入图片说明

但是当我从 Laravel 上传文件时,它被上传到存储桶,但该文件仍然对公众隐藏。那么,上传文件后如何将文件权限更改为公开?

Jor*_*any 8

如果您存储的所有文件都可以或应该公开,您可以添加'visibility' => 'public',因此存储在驱动器中的任何文件都将具有公开可见性:

 's3' => [
            'driver' => 's3',
            'key' => env('AWS_KEY'),
            'secret' => env('AWS_SECRET'),
            'region' => ('AWS_REGION'),
            'bucket' => env('AWS_BUCKET'),
            'visibility' => 'public',
        ],
Run Code Online (Sandbox Code Playgroud)

如果没有,您可以使用相同的设置配置另一个驱动器,包括公共标志:

 's3' => [
            'driver' => 's3',
            'key' => env('AWS_KEY'),
            'secret' => env('AWS_SECRET'),
            'region' => ('AWS_REGION'),
            'bucket' => env('AWS_BUCKET'),

        ],
 's3Public' => [
            'driver' => 's3',
            'key' => env('AWS_KEY'),
            'secret' => env('AWS_SECRET'),
            'region' => ('AWS_REGION'),
            'bucket' => env('AWS_BUCKET'),
            'visibility' => 'public',
        ],
Run Code Online (Sandbox Code Playgroud)

然后只需致电商店选择具有公开可见性的驱动器:

$photo_file_path = $request->file('image_file')->store(
            'images/artworks/gallery-images/'.uniqid(),  's3Public'
          );
Run Code Online (Sandbox Code Playgroud)


Adn*_*taz 6

Laravel 提供了不同的方法来存储文件。

最简单的方法之一是使用storePublicly().

这是一个例子

 $photo_file_path = $request->file('image_file')->storePublicly(
        'images/artworks/gallery-images/'.uniqid()
      );
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。