package main import ( "bytes" "fmt" "io" "io/ioutil" "mime/multipart" "net/http" "net/url" "os" ) func fileUpload(url, file, name string) (err error) { // Prepare a form that you will submit to that URL. var b bytes.Buffer w := multipart.NewWriter(&b) // Add your image file f, err := os.Open(file) if err != nil { return } fw, err := w.CreateFormFile("image", file) if err != nil { return } if _, err = io.Copy(fw, f); err != nil { return } // Add the other fields if fw, err = w.CreateFormField("key"); err != nil { return } if _, err = fw.Write([]byte("KEY")); err != nil { return } // Don't forget to close the multipart writer. // If you don't close it, your request will be missing the terminating boundary. w.Close() // Now that you have a form, you can submit it to your handler. req, err := http.NewRequest("POST", url, &b) if err != nil { return } // Don't forget to set the content type, this will contain the boundary. req.Header.Set("Content-Type", w.FormDataContentType()) // Submit the request client := &http.Client{} res, err := client.Do(req) if err != nil { return } // Check the response if res.StatusCode != http.StatusOK { err = fmt.Errorf("bad status: %s", res.Status) } defer res.Body.Close() contents, err := ioutil.ReadAll(res.Body) if err != nil { return } printResponse(contents, name) return } func urlUpload(targetUrl, file, name string) (err error) { form := url.Values{} form.Set("image", file) imageUrl := form.Encode() req, err := http.NewRequest("POST", targetUrl, bytes.NewBuffer([]byte(imageUrl))) if err != nil { return } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") client := &http.Client{} res, err := client.Do(req) if err != nil { return } if res.StatusCode != http.StatusOK { err = fmt.Errorf("bad status: %s", res.Status) } defer res.Body.Close() contents, err := ioutil.ReadAll(res.Body) if err != nil { return } printResponse(contents, name) return }