如何在laravel中访问公共AWS S3存储桶

时间:2017-09-28 23:25:34

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

我在latheesan-public-bucket区域的AWS中有一个名为eu-west-1的公共S3存储桶。

如果我要在浏览器中访问以下网址(例如):

https://latheesan-public-bucket.s3-eu-west-1.amazonaws.com/

我得到以下XML,表明我在文件夹中有一个文件:

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Name>latheesan-public-bucket</Name>
    <Prefix />
    <Marker />
    <MaxKeys>1000</MaxKeys>
    <IsTruncated>false</IsTruncated>
    <Contents>
        <Key>test.json</Key>
        <LastModified>2017-07-11T16:39:50.000Z</LastModified>
        <ETag>"056f32ee5cf49404607e368bd8d3f2af"</ETag>
        <Size>17658</Size>
        <StorageClass>STANDARD</StorageClass>
    </Contents>
</ListBucketResult>

如果我那么访问https://latheesan-public-bucket.s3-eu-west-1.amazonaws.com/test.json我可以从公共存储桶中下载我的文件。

为了在我的Laravel应用程序中实现相同的目标;我首先通过composer添加了这个包:

  

联盟/ flysystem-AWS-S3-V3

然后在.env我添加了以下内容:

AWS_REGION=eu-west-1
AWS_BUCKET=latheesan-public-bucket

最后,我尝试使用laravel文件系统来访问公共s3存储桶文件,如下所示:

$json = Storage::disk('s3')->get('test.json');

当我这样做的时候;我收到以下错误:

  

从实例配置文件元数据中检索凭据时出错   服务器。 (cURL错误28:连接在1000毫秒后超时   (见http://curl.haxx.se/libcurl/c/libcurl-errors.html))

所以,我用一些假凭证更新了我的.env

AWS_KEY=123
AWS_SECRET=123
AWS_REGION=eu-west-1
AWS_BUCKET=latheesan-public-bucket

现在我收到了这个错误:

Illuminate \ Contracts \ Filesystem \ FileNotFoundException
test.json

所以我的问题是;首先,我在这里做错了什么?如果没有实际提供有效的S3密钥/秘密,是否无法访问laravel中的公共s3存储桶?如果我不了解它怎么办?我只有公共s3桶的网址。

P.S。 latheesan-public-bucket不存在(这是一个虚拟的存储桶名称来解释我的问题,我确实有一个真正的公共存储桶我试图使用它并且它在浏览器中工作正常,如上所述)。

2 个答案:

答案 0 :(得分:2)

当您尝试通过HTTPS网址访问它时,它可以正常运行,因为它是公开的,而您是

当您尝试通过SDK访问它时,它会尝试使用API​​来访问它。

因此,要么为实例配置文件提供访问存储桶的正确权限(不再需要公开),要么只使用http客户端来检索文件。

答案 1 :(得分:0)

如果您使用S3 API访问存储桶,则需要AWS凭据。原因是API需要签署S3请求。