我正在使用Goamz包,并可能需要一些帮助--获取bucket.Multi来流HTTP对S3的响应。
我将通过块2+下载一个HTTP文件,我想将它直接流到一个S3桶中。
看来我需要用一些东西包装resp.Body,这样我就可以将s3.ReaderAtSeeker的实现传递给multi.PutAll
// set up s3
auth, _ := aws.EnvAuth()
s3Con := s3.New(auth, aws.USEast)
bucket := s3Con.Bucket("bucket-name")
// make http request to URL
resp, err := http.Get(export_url)
if err != nil {
fmt.Printf("Get error %v\n", err)
return
}
defer resp.Body.Close()
// set up multi-part
multi, err := bucket.InitMulti(s3Path, "text/plain", s3.Private, s3.Options{})
if err != nil {
fmt.Printf("InitMulti error %v\n", err)
return
}
// Need struct that implements: s3.ReaderAtSeeker
// type ReaderAtSeeker interface {
// io.ReaderAt
// io.ReadSeeker
// }
rs := // Question: what can i wrap `resp.Body` in?
parts, err := multi.PutAll(rs, 5120)
if err != nil {
fmt.Printf("PutAll error %v\n", err)
return
}
err = multi.Complete(parts)
if err != nil {
fmt.Printf("Complete error %v\n", err)
return
}目前,在尝试运行我的程序时,我会得到以下(预期的)错误:
./main.go:50: cannot use resp.Body (type io.ReadCloser) as type s3.ReaderAtSeeker in argument to multi.PutAll:
io.ReadCloser does not implement s3.ReaderAtSeeker (missing ReadAt method)发布于 2015-11-06 21:47:13
一个更简单的方法是使用- http://github.com/minio/minio-go。
它实现了PutObject(),这是一个完全管理的自包含操作,用于上传大型文件。它还会自动对超过5MB的数据并行执行多部分操作。如果没有指定预定义的ContentLength。它将继续上传,直到到达EOF为止。
下面的示例演示了当一个人没有预定义的输入长度,而是一个正在流的io.Reader时,如何做到这一点。在本例中,我使用了"os.Stdin“作为分块输入的等效项。
package main
import (
"log"
"os"
"github.com/minio/minio-go"
)
func main() {
config := minio.Config{
AccessKeyID: "YOUR-ACCESS-KEY-HERE",
SecretAccessKey: "YOUR-PASSWORD-HERE",
Endpoint: "https://s3.amazonaws.com",
}
s3Client, err := minio.New(config)
if err != nil {
log.Fatalln(err)
}
err = s3Client.PutObject("mybucket", "myobject", "application/octet-stream", 0, os.Stdin)
if err != nil {
log.Fatalln(err)
}
}
$ echo "Hello my new-object" | go run stream-object.gohttps://stackoverflow.com/questions/27651344
复制相似问题