func (client *Client) Upload(fpath string) (*api.SimpleResponse, error) { var ( body = &bytes.Buffer{} writer = multipart.NewWriter(body) req = api.UploadFileRequest{Filename: filepath.Base(fpath)} err error ) defer writer.Close() req.MD5, err = client.hashFile(fpath) if err != nil { return nil, err } log.Infof("Uploading file %s", fpath) hClient, err := client.getHttpClient() if err != nil { return nil, err } url := fmt.Sprintf("http://%s/%s", client.Host, "upload") // Write JSON data as post param req.Sign(client.AccessKeyName, client.AccessKey) requestBytes, err := json.Marshal(req) err = writer.WriteField("data", string(requestBytes)) if err != nil { return nil, err } // Write file to request file, err := os.Open(fpath) if file != nil { defer file.Close() } if err != nil { return nil, err } part, err := writer.CreateFormFile("file", fpath) if err != nil { return nil, err } _, err = io.Copy(part, file) writer.Close() // Make the request hReq, err := http.NewRequest("POST", url, body) hReq.Header.Set("Content-Type", writer.FormDataContentType()) resp, err := hClient.Do(hReq) if resp != nil { defer resp.Body.Close() } if err != nil { return nil, err } // Read the response responseData, _ := ioutil.ReadAll(resp.Body) if resp.StatusCode != 200 { var errorResponse api.ApiError json.Unmarshal(responseData, &errorResponse) return nil, errors.New(errorResponse.Error) } res := &api.SimpleResponse{} json.Unmarshal(responseData, res) return res, err }