diff options
author | Alexander Kiryukhin <a.kiryukhin@mail.ru> | 2019-08-09 02:02:05 +0300 |
---|---|---|
committer | Alexander Kiryukhin <a.kiryukhin@mail.ru> | 2019-08-09 02:02:05 +0300 |
commit | 94c96cef29cd83bc60b2eabb8bb89c9fd8c7059b (patch) | |
tree | 676b3e2b6ffb171e102931e5fac01f7a4621c20a /uploads.go | |
parent | d13acd7da9bd1c08de33b91120a479df88d21db2 (diff) |
0.1.8 Release
Diffstat (limited to 'uploads.go')
-rw-r--r-- | uploads.go | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/uploads.go b/uploads.go new file mode 100644 index 0000000..57b2ce8 --- /dev/null +++ b/uploads.go @@ -0,0 +1,84 @@ +// Package tamtam implements TamTam Bot API +// Copyright (c) 2019 Alexander Kiryukhin <a.kiryukhin@mail.ru> +package tamtam + +import ( + "bytes" + "encoding/json" + "io" + "log" + "mime/multipart" + "net/http" + "net/url" + "os" +) + +type uploads struct { + client *client +} + +func newUploads(client *client) *uploads { + return &uploads{client: client} +} + +func (a *uploads) GetUploadURL(uploadType UploadType) (*UploadEndpoint, error) { + result := new(UploadEndpoint) + values := url.Values{} + values.Set("type", string(uploadType)) + body, err := a.client.request(http.MethodPost, "uploads", values, nil) + if err != nil { + return result, err + } + defer func() { + if err := body.Close(); err != nil { + log.Println(err) + } + }() + return result, json.NewDecoder(body).Decode(result) +} + +func (a *uploads) UploadMedia(uploadType UploadType, filename string) (*UploadedInfo, error) { + bodyBuf := &bytes.Buffer{} + bodyWriter := multipart.NewWriter(bodyBuf) + + fileWriter, err := bodyWriter.CreateFormFile("data", filename) + if err != nil { + return nil, err + } + + fh, err := os.Open(filename) + if err != nil { + return nil, err + } + defer func() { + if err := fh.Close(); err != nil { + log.Println(err) + } + }() + _, err = io.Copy(fileWriter, fh) + if err != nil { + return nil, err + } + + if err := bodyWriter.Close(); err != nil { + return nil, err + } + + target, err := a.GetUploadURL(uploadType) + if err != nil { + return nil, err + } + contentType := bodyWriter.FormDataContentType() + + resp, err := http.Post(target.Url, contentType, bodyBuf) + if err != nil { + return nil, err + } + defer func() { + if err := resp.Body.Close(); err != nil { + log.Println(err) + } + }() + result := new(UploadedInfo) + return result, json.NewDecoder(resp.Body).Decode(result) +} |