Skip to content

Instantly share code, notes, and snippets.

@omerkaya1
Created August 16, 2019 11:59
Show Gist options
  • Save omerkaya1/ec481e42e2477cdba54773c886d463f3 to your computer and use it in GitHub Desktop.
Save omerkaya1/ec481e42e2477cdba54773c886d463f3 to your computer and use it in GitHub Desktop.
Post a large file using io.Pipe() so that we don't need to read the whole file into memory
func (c *ClientImpl) PostLargeFile(reader io.ReadCloser, formParams map[string]string) (io.ReadCloser, error) {
r, w := io.Pipe()
writer := multipart.NewWriter(w)
defer r.Close()
go func() {
defer w.Close()
defer reader.Close()
for key, val := range formParams {
if key == util.SomeTag || key == util.SomeFileType {
_ = writer.WriteField(key, val)
}
}
part, err := writer.CreateFormFile(util.SomeTag, util.SomeFileType)
if err != nil {
logger.Error("error: %v", err)
return
}
if _, err := io.Copy(part, reader); err != nil {
logger.Error("error: %v", err)
return
}
if err := writer.Close(); err != nil {
logger.Error("error: %v", err)
return
}
}()
request, err := http.NewRequest(http.MethodPost, fmt.Sprintf("%s/%s", SomeURL, uploadPath), r)
if err != nil {
return nil, err
}
request.Header.Set(util.ContentType, writer.FormDataContentType())
request.Header.Set(util.UserAgent, util.YourAppsVersion)
// We can also create context and add it to the request
resp, err := ac.doRequestWrapper(request)
if err != nil {
return nil, err
}
if resp.StatusCode != http.StatusOK {
logger.Error("error: %v: ", "post request failed", resp.Status)
return nil, errors.New(util.SomeError)
}
return resp.Body, nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment