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
+		}
 	}
 }