# HG changeset patch # User Mikael Berthe # Date 1492283314 -7200 # Node ID 330c4b83f7d34a429ef4fdba1d155dbfa9e3177d # Parent 2bbb72b9ebf6a6232f1b91ef4c2d34e1fb20e08e Add UploadMedia() diff -r 2bbb72b9ebf6 -r 330c4b83f7d3 media.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/media.go Sat Apr 15 21:08:34 2017 +0200 @@ -0,0 +1,83 @@ +package gondole + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "mime/multipart" + "os" + "path/filepath" + + "github.com/sendgrid/rest" +) + +// UploadMedia uploads the given file and returns an attachment +func (g *Client) UploadMedia(filePath string) (*Attachment, error) { + var b bytes.Buffer + + if filePath == "" { + return nil, ErrInvalidParameter + } + + f, err := os.Open(filePath) + if err != nil { + return nil, fmt.Errorf("cannot read file: %s", err.Error()) + } + defer f.Close() + + w := multipart.NewWriter(&b) + formWriter, err := w.CreateFormFile("file", filepath.Base(filePath)) + if err != nil { + return nil, fmt.Errorf("media upload: cannot create form: %s", err.Error()) + } + if _, err = io.Copy(formWriter, f); err != nil { + return nil, fmt.Errorf("media upload: cannot create form: %s", err.Error()) + } + + w.Close() + + req := g.prepareRequest("media", rest.Post, nil) + req.Headers["Content-Type"] = w.FormDataContentType() + req.Body = b.Bytes() + + /* + reqObj, err := rest.BuildRequestObject(req) + if err != nil { + return nil, fmt.Errorf("cannot build stream request: %s", err.Error()) + } + + resp, err := rest.MakeRequest(reqObj) + if err != nil { + return nil, fmt.Errorf("cannot open stream: %s", err.Error()) + } + if resp.StatusCode != 200 { + resp.Body.Close() + return nil, errors.New(resp.Status) + } + return resp, nil + */ + + // Make API call + r, err := restAPI(req) + if err != nil { + return nil, fmt.Errorf("media upload failed: %s", err.Error()) + } + + // Check for error reply + var errorResult Error + if err := json.Unmarshal([]byte(r.Body), &errorResult); err == nil { + // The empty object is not an error + if errorResult.Text != "" { + return nil, fmt.Errorf("%s", errorResult.Text) + } + } + + // Not an error reply; let's unmarshal the data + var attachment Attachment + err = json.Unmarshal([]byte(r.Body), &attachment) + if err != nil { + return nil, fmt.Errorf("cannot decode API response (media): %s", err.Error()) + } + return &attachment, nil +}