php aws s3 下载文件,关于Amazon S3:使用AWS开发工具包Go的完整URI从S3下载文件

我看到的示例使用AWS Go for SDK从S3下载文件的形式如下:

downloader := s3manager.NewDownloader(session, /* other args */)

s3object := &s3.GetObjectInput{

Bucket: aws.String(myBucket),

Key: aws.String(myKey),

}

bytesDownloaded, err := downloader.Download(myFile, s3object)

也就是说,使用存储桶和密钥来指定文件。 但是,如果我已经在S3上拥有文件的完整URI,该怎么办? 例如。:

https://s3.us-west-2.amazonaws.com/myBucket/myKey

有没有一种方法可以使用SDK指定要直接使用URL下载的文件?

不,存储桶不是公共的。 在SDK中,我还要设置访问密钥和秘密密钥(从示例代码中删除)。

最后,如果根本无法通过SDK执行我所要求的操作,那么这是可以接受的(尽管不是期望的)答案。

水桶公开吗? http.Get,不需要SDK。 只要确保您看到森林即可。

不,存储桶不是公共的。 (我已经更新了问题以明确说明这一点。)

无法做您想做的事。获取私有对象的唯一方法是:

使用存储桶和密钥下载文件

生成一个预签名的URL并对该URL进行hhtp.Get(要生成预签名的URL,您需要存储桶和密钥)

如果您确实要使用URL,建议您围绕s3.GetObjectInput创建一个包装器,该包装器接受URL作为参数,对其进行解析,然后创建s3.GetObjectInput对象。

另外,我不知道您能否做到这一点,取决于您的用例,但是如果您将URL存储在某个地方,这就是为什么要使用它们,则可以考虑以较长的有效时间存储预签名的url,然后,当您要获取对象时,可以使用该URL。

预签名网址的最长有效期为7天,因此最好不要稍后存储和检索它们

您可以解析URL以获取存储桶和密钥:

package main

import (

"fmt"

"log"

"net/url"

"strings"

)

func main() {

u, err := url.Parse("https://s3.us-west-2.amazonaws.com/myBucket/myKey/morekey")

if err != nil {

log.Fatal(err)

}

path := strings.SplitN(u.Path,"/", 3)

bucket := path[1]

key := path[2]

fmt.Println(bucket)

fmt.Println(key)

}

可运行:https://play.golang.org/p/G3Mxmm4f4qM

是的,我知道我可以解析它。 我专门问过是否可以直接使用SDK。

使用路径包来处理路径。 例如,它将正确处理双斜杠。

@Peter路径包与用于Go的AWS开发工具包有什么关系?

@ PaulJ.Lucas,什么都没有。 它与URL解析有关。 除非将URL规范化(例如,不包含双斜杠),否则string.Split *函数不适用。

为此创建了新的S3URLtoURI解析器。

func S3URLtoURI(s3Url string) (map[string]string, error) {

m := make(map[string]string)

u, err := url.Parse(s3Url)

if err != nil {

return m, err

}

if u.Scheme =="s3" {

//s3: //bucket/key

m["bucket"] = u.Host

m["key"] = strings.TrimLeft(u.Path,"/")

} else if u.Scheme =="https" {

host := strings.SplitN(u.Host,".", 2)

if host[0] =="s3" {

// No bucket name in the host;

path := strings.SplitN(u.Path,"/", 3)

m["bucket"] = path[1]

m["key"] = path[2]

} else { //bucket name in host

m["bucket"] = host[0]

m["key"] = strings.TrimLeft(u.Path,"/")

}

}

return m, err

}

可运行的:https://play.golang.org/p/vkPJ7E4Fyno

在这里,您首先需要对尝试从S3下载的对象启用公共访问。您可以通过以下两种方法之一来实现。

使对象公开可读。但是请记住,无论谁获得访问权

资源URL可以从S3下载对象。

通过存储桶策略授予对S3存储桶的匿名访问。参考

在这里阅读有关此策略示例的方法。记得验证

您在这条路线上看到的内容。

使用PreSignedUrl允许在限定时间内下载对象

方式。这就是我从上述方法中所希望的。

现在的最后一步是使用go的http客户端调用您的预签名url并下载所需的对象。

不可以,该对象不能公开读取。 (我已经更新了我的问题。)该对象只能由所有者访问,所以我不相信您的任何建议都会起作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值