func UploadProfilePic(wr http.ResponseWriter, req *http.Request) { var ( profileImgLoc string id int64 err error p *data.Profile file multipart.File header *multipart.FileHeader enc *json.Encoder ) enc = json.NewEncoder(wr) params := mux.Vars(req) id, err = strconv.ParseInt(params["id"], 10, 64) p, err = data.FindProfileById(id) req.ParseMultipartForm(10 << 20) //approx 10MB file, header, err = req.FormFile("file") handleUploadErr := func(err error, status int) { if nil != err { wr.WriteHeader(status) enc.Encode(NewErrorJSON(err.Error(), status)) } } if err != nil { log.Println("error upload pic " + err.Error()) handleUploadErr(err, http.StatusBadRequest) return } defer file.Close() uploadedFilePath, err := service.SaveUploadedFile(file, header.Filename) if err != nil { log.Println("failed to create thumbnail file " + err.Error()) handleUploadErr(err, http.StatusInternalServerError) return } uploadedFilePath, err = service.ThumbnailMultipart(file, header.Filename) if err != nil { log.Println("failed to create thumbnail file " + err.Error()) handleUploadErr(err, http.StatusInternalServerError) return } profileImgLoc, err = data.PutInBucket(uploadedFilePath, header.Filename) if err != nil { log.Println("failed up upload to s3 " + err.Error()) handleUploadErr(err, http.StatusInternalServerError) return } p.UpdateProfilePic(profileImgLoc) enc.Encode(p) }