Add UploadMedia()
authorMikael Berthe <mikael@lilotux.net>
Sat, 15 Apr 2017 21:08:34 +0200
changeset 126 330c4b83f7d3
parent 125 2bbb72b9ebf6
child 127 96a7f2432d27
Add UploadMedia()
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
+}