如果您确实想通过您的服务流式传输文件(而不是按照已接受的答案中的建议直接下载)-


import (

    ...


    "github.com/aws/aws-sdk-go/aws"

    "github.com/aws/aws-sdk-go/service/s3"

)


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


    sess, awsSessErr := session.NewSession(&aws.Config{

        Region:      aws.String("eu-west-1"),

        Credentials: credentials.NewStaticCredentials("my-aws-id", "my-aws-secret", ""),

    })

    if awsSessErr != nil {

        http.Error(w, fmt.Sprintf("Error creating aws session %s", awsSessErr.Error()), http.StatusInternalServerError)

        return

    }


    result, err := s3.New(sess).GetObject(&s3.GetObjectInput{

        Bucket: aws.String("my-bucket"),

        Key:    aws.String("my-file-id"),

    })

    if err != nil {

        http.Error(w, fmt.Sprintf("Error getting file from s3 %s", err.Error()), http.StatusInternalServerError)

        return

    }


    w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", "my-file.csv"))

    w.Header().Set("Cache-Control", "no-store")


    bytesWritten, copyErr := io.Copy(w, result.Body)

    if copyErr != nil {

        http.Error(w, fmt.Sprintf("Error copying file to the http response %s", copyErr.Error()), http.StatusInternalServerError)

        return

    }

    log.Printf("Download of \"%s\" complete. Wrote %s bytes", "my-file.csv", strconv.FormatInt(bytesWritten, 10))

}