func NewBodyFromFile(fname string) (*Body, error) {
	file, err := os.Open(fname)
	if err != nil {
		return nil, err
	}
	fileInfo, infoErr := file.Stat()
	if infoErr != nil {
		return nil, infoErr
	}
	contentMD5, md5Err := util.CalculateContentMD5(file, fileInfo.Size())
	if md5Err != nil {
		return nil, md5Err
	}
	if _, err = file.Seek(0, 0); err != nil {
		return nil, err
	}
	return &Body{file, fileInfo.Size(), contentMD5}, nil
}
NewBodyFromFile - build a Body object from the given file name to be used in the http request,
it calculates the content-md5 of the byte stream and store the size as well as the stream.

PARAMS:
- fname: the given file name
RETURNS:
- *Body: the return Body object
- error: error if any specific error occurs
package bce
import (
	"bytes"
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"github.com/baidubce/bce-sdk-go/http"
	"github.com/baidubce/bce-sdk-go/util"
)
type Body struct {
	stream     io.ReadCloser
	size       int64
	contentMD5 string
}
func (b *Body) Stream() io.ReadCloser { return b.stream }
func (b *Body) SetStream(stream io.ReadCloser) { b.stream = stream }
func (b *Body) Size() int64 { return b.size }
func (b *Body) ContentMD5() string { return b.contentMD5 }
func NewBodyFromBytes(stream []byte) (*Body, error) {
	buf := bytes.NewBuffer(stream)
	size := int64(buf.Len())
	contentMD5, err := util.CalculateContentMD5(buf, size)
	if err != nil {
		return nil, err
	}
	buf = bytes.NewBuffer(stream)
	return &Body{ioutil.NopCloser(buf), size, contentMD5}, nil
}
func NewBodyFromString(str string) (*Body, error) {
	buf := bytes.NewBufferString(str)
	size := int64(len(str))
	contentMD5, err := util.CalculateContentMD5(buf, size)
	if err != nil {
		return nil, err
	}
	buf = bytes.NewBufferString(str)
	return &Body{ioutil.NopCloser(buf), size, contentMD5}, nil
}