diff --git a/oss/conn.go b/oss/conn.go index b07ed36c..0517995e 100644 --- a/oss/conn.go +++ b/oss/conn.go @@ -43,7 +43,7 @@ var signKeyList = []string{"acl", "uploads", "location", "cors", "udfId", "udfImageDesc", "udfApplication", "comp", "udfApplicationLog", "restore", "callback", "callback-var", "qosInfo", "policy", "stat", "encryption", "versions", "versioning", "versionId", "requestPayment", - "x-oss-request-payer"} + "x-oss-request-payer", "sequential"} // init initializes Conn func (conn *Conn) init(config *Config, urlMaker *urlMaker, client *http.Client) error { diff --git a/oss/multipart.go b/oss/multipart.go index 0c32d361..39a49013 100644 --- a/oss/multipart.go +++ b/oss/multipart.go @@ -24,8 +24,14 @@ import ( func (bucket Bucket) InitiateMultipartUpload(objectKey string, options ...Option) (InitiateMultipartUploadResult, error) { var imur InitiateMultipartUploadResult opts := addContentType(options, objectKey) - params := map[string]interface{}{} + params, _ := getRawParams(options) + _, ok := params["sequential"] + if ok { + // convert "" to nil + params["sequential"] = nil + } params["uploads"] = nil + resp, err := bucket.do("POST", objectKey, params, opts, nil, nil) if err != nil { return imur, err diff --git a/oss/option.go b/oss/option.go index 6cb9f5f2..8724c32b 100644 --- a/oss/option.go +++ b/oss/option.go @@ -330,6 +330,11 @@ func PartNumberMarker(value int) Option { return addParam("part-number-marker", strconv.Itoa(value)) } +// Sequential is an option to set sequential parameter for InitiateMultipartUpload +func Sequential() Option { + return addParam("sequential", "") +} + // DeleteObjectsQuiet false:DeleteObjects in verbose mode; true:DeleteObjects in quite mode. Default is false. func DeleteObjectsQuiet(isQuiet bool) Option { return addArg(deleteObjectsQuiet, isQuiet) diff --git a/oss/upload_test.go b/oss/upload_test.go index c6365fe8..2fec8884 100644 --- a/oss/upload_test.go +++ b/oss/upload_test.go @@ -698,3 +698,42 @@ func (s *OssUploadSuite) TestUploadFileWithForbidOverWrite(c *C) { forceDeleteBucket(client, bucketName, c) } + +// TestUploadFileWithSequential +func (s *OssUploadSuite) TestUploadFileWithSequential(c *C) { + // create a bucket with default proprety + client, err := New(endpoint, accessID, accessKey) + c.Assert(err, IsNil) + + bucketName := bucketNamePrefix + randLowStr(6) + err = client.CreateBucket(bucketName) + c.Assert(err, IsNil) + bucket, err := client.Bucket(bucketName) + + fileName := "../sample/BingWallpaper-2015-11-07.jpg" + fileInfo, err := os.Stat(fileName) + c.Assert(err, IsNil) + + objectName := objectNamePrefix + randStr(8) + + var respHeader http.Header + + // UploadFile with properties + options := []Option{ + Sequential(), + GetResponseHeader(&respHeader), + Checkpoint(true, fileName+".cp"), + } + + // Updating the file + err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...) + c.Assert(err, IsNil) + + respHeader, err = bucket.GetObjectDetailedMeta(objectName) + c.Assert(err, IsNil) + + strMD5 := respHeader.Get("Content-MD5") + c.Assert(len(strMD5) > 0, Equals, true) + + forceDeleteBucket(client, bucketName, c) +}