diff --git a/client/image.go b/client/image.go index f925544536722264b8d6ef3073fe1be667ce7786..51f70d6139390bd634ec60db6f639b22456f5d8b 100644 --- a/client/image.go +++ b/client/image.go @@ -2,6 +2,8 @@ package client import ( "bytes" + "fmt" + "io" "mime/multipart" "net/http" "random.chars.jp/git/image-board/api" @@ -17,13 +19,21 @@ func (r *Remote) Images() ([]string, error) { } // ImageAdd adds an image to Remote and returns a store.Image. -func (r *Remote) ImageAdd(data []byte) (store.Image, error) { +func (r *Remote) ImageAdd(reader io.Reader) (store.Image, error) { + if c, ok := reader.(io.Closer); ok { + defer func() { + if err := c.Close(); err != nil { + fmt.Printf("Error closing Closer, %s", err) + } + }() + } + buf := &bytes.Buffer{} w := multipart.NewWriter(buf) - if f, err := w.CreateFormFile("image", ""); err != nil { + if f, err := w.CreateFormField("image"); err != nil { return store.Image{}, err } else { - if _, err = f.Write(data); err != nil { + if _, err = io.Copy(f, reader); err != nil { return store.Image{}, err } } @@ -32,12 +42,18 @@ func (r *Remote) ImageAdd(data []byte) (store.Image, error) { return store.Image{}, err } - if resp, err := r.request(http.MethodPost, api.Image, buf); err != nil { + if req, err := http.NewRequest(http.MethodPost, r.URL(api.Image), buf); err != nil { return store.Image{}, err } else { - var image store.Image - err = unmarshal(resp.Body, &image) - return image, err + req.Header.Set("Content-Type", w.FormDataContentType()) + var resp *http.Response + if resp, err = r.send(req); err != nil { + return store.Image{}, err + } else { + var image store.Image + err = unmarshal(resp.Body, &image) + return image, err + } } }