Example #1
0
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
}