【问题标题】:Setting aws s3 file permission to public after upload in Laravel在 Laravel 中上传后将 aws s3 文件权限设置为公开
【发布时间】:2018-02-22 23:20:18
【问题描述】:

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

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

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

这是我的存储桶策略

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

如您所见,我的存储桶现在对访问控制和存储桶策略都是公开的。

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

【问题讨论】:

    标签: laravel amazon-web-services amazon-s3


    【解决方案1】:

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

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

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

     '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',
            ],
    

    然后只需调用商店选择公开可见的驱动器:

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

    【讨论】:

    • 'visibility' => 'public',非常重要。esle 你看不到任何文件。
    【解决方案2】:

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

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

    这是一个例子

     $photo_file_path = $request->file('image_file')->storePublicly(
            'images/artworks/gallery-images/'.uniqid()
          );
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 2017-03-09
      • 2020-04-23
      • 1970-01-01
      • 2012-12-31
      • 2015-04-19
      • 1970-01-01
      相关资源
      最近更新 更多