首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有块`http.GET`和Goamz `multi.PutAll`的Golang多部分上传

带有块`http.GET`和Goamz `multi.PutAll`的Golang多部分上传
EN

Stack Overflow用户
提问于 2014-12-25 22:50:53
回答 1查看 1.9K关注 0票数 1

我正在使用Goamz包,并可能需要一些帮助--获取bucket.Multi来流HTTP对S3的响应。

我将通过块2+下载一个HTTP文件,我想将它直接流到一个S3桶中。

看来我需要用一些东西包装resp.Body,这样我就可以将s3.ReaderAtSeeker的实现传递给multi.PutAll

代码语言:javascript
运行
复制
// 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
}

目前,在尝试运行我的程序时,我会得到以下(预期的)错误:

代码语言:javascript
运行
复制
./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)
EN

回答 1

Stack Overflow用户

发布于 2015-11-06 21:47:13

一个更简单的方法是使用- http://github.com/minio/minio-go

它实现了PutObject(),这是一个完全管理的自包含操作,用于上传大型文件。它还会自动对超过5MB的数据并行执行多部分操作。如果没有指定预定义的ContentLength。它将继续上传,直到到达EOF为止。

下面的示例演示了当一个人没有预定义的输入长度,而是一个正在流的io.Reader时,如何做到这一点。在本例中,我使用了"os.Stdin“作为分块输入的等效项。

代码语言:javascript
运行
复制
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.go
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27651344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档