amazon web services - AWS S3 large file reverse proxying with golang's http.ResponseWriter -


i have request handler named download want access large file amazon s3 , push user's browser. goals are:

  • to record request information before granting user access file
  • to not buffer file memory much. files may become large.

here i've explored far:

func download(w http.responsewriter, r *http.request) {      sess := session.new(&aws.config{         region:             aws.string("eu-west-1"),         endpoint:           aws.string("s3-eu-west-1.amazonaws.com"),         s3forcepathstyle:   aws.bool(true),         credentials:        cred,     })      downloader := s3manager.newdownloader(sess)     // can't write directly responsewriter. doesn't implement writeat.      // besides, doesn't seem right thing do.     _, err := downloader.download(w, &s3.getobjectinput{         bucket: aws.string(bucket),         key: aws.string(filename),     })     if err != nil {         log.error(4, err.error())         return     }  } 

i'm wondering if there isn't better approach (given goals i'm trying achieve).

any suggestions welcome. thank in advance :-)

if file potentially large, don't want go trough own server. best approach (in opinion) have user download directly s3.

you can generating presigned url:

func download(w http.responsewriter, r *http.request) {      ...      sess := session.new(&aws.config{         region:             aws.string("eu-west-1"),         endpoint:           aws.string("s3-eu-west-1.amazonaws.com"),         s3forcepathstyle:   aws.bool(true),         credentials:        cred,     })      s3svc := s3.new(sess)     req, _ := s3svc.getobjectrequest(&s3.getobjectinput{         bucket: aws.string(bucket),         key: aws.string(filename),     })      url, err := req.presign(5 * time.minute)     if err != nil {         //handle error     }      http.redirect(w, r, url, http.statustemporaryredirect) } 

the presigned url valid limited time (5 minutes in example, adjust needs) , takes user directly s3. no need worry downloads anymore!


Comments

Popular posts from this blog

routing - AngularJS State management ->load multiple states in one page -

python - GRASS parser() error -

Swift game error message -