我看到的示例使用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并下载所需的对象。
不可以,该对象不能公开读取。 (我已经更新了我的问题。)该对象只能由所有者访问,所以我不相信您的任何建议都会起作用。