func (bucket Bucket) UploadPartFromFile(imur InitiateMultipartUploadResult, filePath string,
	startPosition, partSize int64, partNumber int, options ...Option) (UploadPart, error) {
	var part = UploadPart{}
	fd, err := os.Open(filePath)
	if err != nil {
		return part, err
	}
	defer fd.Close()
	fd.Seek(startPosition, os.SEEK_SET)
	request := &UploadPartRequest{
		InitResult: &imur,
		Reader:     fd,
		PartSize:   partSize,
		PartNumber: partNumber,
	}
	result, err := bucket.DoUploadPart(request, options)
	return result.Part, err
}
UploadPartFromFile uploads part from the file.

imur    the return value of a successful InitiateMultipartUpload.
filePath    the local file path to upload.
startPosition    the start position in the local file.
partSize    the part size.
partNumber    the part number (from 1 to 10,000)

UploadPart    the return value consists of PartNumber and ETag.
error    it's nil if the operation succeeds, otherwise it's an error object.
package oss
import (
	"bytes"
	"encoding/xml"
	"io"
	"net/http"
	"net/url"
	"os"
	"sort"
	"strconv"
)
func (bucket Bucket) InitiateMultipartUpload(objectKey string, options ...Option) (InitiateMultipartUploadResult, error) {
	var imur InitiateMultipartUploadResult
	opts := addContentType(options, objectKey)
	params := map[string]interface{}{}
	params["uploads"] = nil
	resp, err := bucket.do("POST", objectKey, params, opts, nil, nil)
	if err != nil {
		return imur, err
	}
	defer resp.Body.Close()
	err = xmlUnmarshal(resp.Body, &imur)
	return imur, err
}
func (bucket Bucket) UploadPart(imur InitiateMultipartUploadResult, reader io.Reader,
	partSize int64, partNumber int, options ...Option) (UploadPart, error) {
	request := &UploadPartRequest{
		InitResult: &imur,
		Reader:     reader,
		PartSize:   partSize,
		PartNumber: partNumber,
	}
	result, err := bucket.DoUploadPart(request, options)
	return result.Part, err
}