Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Golang中的AWS S3读取文件_Go_Heroku_Amazon S3 - Fatal编程技术网

从Golang中的AWS S3读取文件

从Golang中的AWS S3读取文件,go,heroku,amazon-s3,Go,Heroku,Amazon S3,我正试图在Heroku上部署一个golang代码。我的代码需要一个文本文件作为输入,我需要从S3 bucket获取这个文本文件。我的go代码以文件名作为输入,有人能提供代码片段从S3读取文件并将其内容存储到文件中吗 我的GOlang代码- func getDomains(path string) (lines []string, Error error) { file, err := os.Open(path) if err != nil { log.Fat

我正试图在Heroku上部署一个golang代码。我的代码需要一个文本文件作为输入,我需要从S3 bucket获取这个文本文件。我的go代码以文件名作为输入,有人能提供代码片段从S3读取文件并将其内容存储到文件中吗

我的GOlang代码-

  func getDomains(path string) (lines []string, Error error) {

    file, err := os.Open(path)
    if err != nil {
        log.Fatalln(err)
    }

    defer file.Close()

    scanner := bufio.NewScanner(file)

    for scanner.Scan() {
        lines = append(lines, scanner.Text())
    }

    return lines, scanner.Err()
}

func Process(w http.ResponseWriter, r *http.Request) {


    urls := make(chan *Http, Threads*10)
    list, err := getDomains("**NEED A TEXT FILE FROM S3 HERE as an argument**")
    if err != nil {
        log.Fatalln(err)
    }

    var wg sync.WaitGroup
    for i := 0; i < Threads; i++ {
        wg.Add(1)
        go func() {
            for url := range urls {
                url.DNS()
            }

            wg.Done()
        }()
    }

    for i := 0; i < len(list); i++ {
        Progress := fmt.Sprintln(w, len(list))
        urls <- &Http{Url: list[i], Num: Progress}
    }

    close(urls)

    wg.Wait()

    fmt.Printf("\r%s", strings.Repeat(" ", 100))
    fmt.Fprintln(w, "\rTask completed.\n")
}
func getDomains(路径字符串)(第[]行字符串,错误){
文件,错误:=os.Open(路径)
如果错误!=零{
log.Fatalln(错误)
}
延迟文件。关闭()
扫描程序:=bufio.NewScanner(文件)
对于scanner.Scan(){
lines=append(行,scanner.Text())
}
返回行,scanner.Err()
}
func进程(w http.ResponseWriter,r*http.Request){
URL:=make(chan*Http,线程*10)
list,err:=getDomains(“**这里需要一个来自S3的文本文件作为参数**”)
如果错误!=零{
log.Fatalln(错误)
}
var wg sync.WaitGroup
对于i:=0;iURL下面的代码片段应该可以工作(假设您已经安装了正确的依赖项):

主程序包
进口(
“github.com/aws/aws sdk go/aws”
“github.com/aws/aws sdk go/aws/session”
“github.com/aws/aws sdk go/service/s3”
“github.com/aws/aws sdk go/service/s3/s3manager”
“fmt”
“日志”
“操作系统”
)
func main(){
//注意:您需要将AWS凭据存储在~/.AWS/credentials中
//1)定义您的bucket和item名称
桶:=“”
项目:=“”
//2)创建AWS会话
sess,uz:=session.NewSession(&aws.Config){
地区:aws.String(“us-west-2”)},
)
//3)创建新的AWS S3下载程序
downloader:=s3manager.NewDownloader(sess)
//4)从bucket下载项目。如果出现错误,请记录并退出。否则,请通知用户下载成功。
文件,错误:=os.Create(项)
numBytes,err:=downloader.Download(文件,
&s3.GetObjectInput{
桶:aws.字符串(桶),
键:aws.String(项),
})
如果错误!=零{
log.Fatalf(“无法下载项目%q,%v”,项目,错误)
}
fmt.Println(“已下载”,file.Name(),numBytes,“bytes”)
}

有关更多详细信息,您可以查看和,这里有一个使用SDK的V2获取对象的函数(改编自中的示例):

注意:无错误处理-仅演示代码

package s3demo

import (
    "os"
    "context"
    "fmt"
    "io/ioutil"
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/aws/awserr"
    "github.com/aws/aws-sdk-go-v2/aws/external"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

func GetObjectWithV2SDKDemo() {
    bucket := "YOUR_BUCKET"
    key := "YOUR_OBJECT_KEY"
    fileName := "YOUR_FILE_PATH"

    // may need AWS_PROFILE and AWS_REGION populated as environment variables
    cfg, err := external.LoadDefaultAWSConfig()
    if err != nil {
        panic("failed to load config, " + err.Error())
    }

    svc := s3.New(cfg)
    ctx := context.Background()
    req := svc.GetObjectRequest(&s3.GetObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
    })

    resp, err := req.Send(ctx)
    if err != nil {
        panic(err)
    }

    s3objectBytes, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
    // create file
    f, err := os.Create(fileName)
    defer f.Close()
    if err != nil {
        panic(err)
    }

    bytesWritten, err := f.Write(s3objectBytes)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Fetched %d bytes for S3Object\n", bytesWritten)
    fmt.Printf("successfully downloaded data from %s/%s\n to file %s", bucket, key, fileName)
} 

使用当前稳定的AWS lib进行go:

sess := session.Must(session.NewSession(&aws.Config{
    ....
    }))


svc := s3.New(sess)

rawObject, err := svc.GetObject(
                &s3.GetObjectInput{
                    Bucket: aws.String("toto"),
                    Key:    aws.String("toto.txt"),
                })

buf := new(bytes.Buffer)
buf.ReadFrom(rawObject.Body)
myFileContentAsString := buf.String()

请参阅。aws文档中有一个下载功能,我需要一个只读取文件的功能从S3获取对象。
文件
来自哪里?从Github示例文件指向对象下载到的本地文件。因此,此行文件err:=os.Create(项)应该是file,err:=os.Create(“item_local”)。现在,当您运行上述程序时,它将下载到item_local,并将其放置在您运行程序的任何位置。
sess := session.Must(session.NewSession(&aws.Config{
    ....
    }))


svc := s3.New(sess)

rawObject, err := svc.GetObject(
                &s3.GetObjectInput{
                    Bucket: aws.String("toto"),
                    Key:    aws.String("toto.txt"),
                })

buf := new(bytes.Buffer)
buf.ReadFrom(rawObject.Body)
myFileContentAsString := buf.String()