yubin.byb пре 9 година
родитељ
комит
0524e68be0
9 измењених фајлова са 28 додато и 11 уклоњено
  1. 1 1
      README.md
  2. 3 2
      oss/bucket.go
  3. 2 1
      oss/bucket_test.go
  4. 11 0
      oss/client.go
  5. 2 0
      oss/conf.go
  6. 2 1
      oss/conn.go
  7. 2 2
      oss/download.go
  8. 2 1
      oss/error.go
  9. 3 3
      sample/get_object.go

+ 1 - 1
README.md

@@ -6,7 +6,7 @@
 > - 使用此SDK,用户可以方便地在任何应用、任何时间、任何地点上传,下载和管理数据。
 
 ## 版本
-> - 当前版本:0.1.2
+> - 当前版本:0.1.3
 
 ## 运行环境
 > - 推荐使用Go 1.4及以上。

+ 3 - 2
oss/bucket.go

@@ -97,8 +97,9 @@ func (bucket Bucket) GetObjectToFile(objectKey, filePath string, options ...Opti
 		return err
 	}
 	defer resp.body.Close()
-
-	fd, err := os.OpenFile(filePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0660)
+	
+	// 如果文件不存在则创建,存在则清空
+	fd, err := os.OpenFile(filePath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0660)
 	if err != nil {
 		return err
 	}

+ 2 - 1
oss/bucket_test.go

@@ -1297,7 +1297,7 @@ func (s *OssBucketSuite) TestAddContentType(c *C) {
 
 func (s *OssBucketSuite) TestGetConfig(c *C) {
 	client, err := New(endpoint, accessID, accessKey, UseCname(true),
-		Timeout(11, 12), SecurityToken("token"))
+		Timeout(11, 12), SecurityToken("token"), EnableMD5(false))
 	c.Assert(err, IsNil)
 
 	bucket, err := client.Bucket(bucketName)
@@ -1310,6 +1310,7 @@ func (s *OssBucketSuite) TestGetConfig(c *C) {
 
 	c.Assert(bucket.getConfig().SecurityToken, Equals, "token")
 	c.Assert(bucket.getConfig().IsCname, Equals, true)
+	c.Assert(bucket.getConfig().IsEnableMD5, Equals, false)
 }
 
 // TestSTSTonek

+ 11 - 0
oss/client.go

@@ -640,6 +640,17 @@ func SecurityToken(token string) ClientOption {
 	}
 }
 
+//
+// EnableMD5 上传时是否启用MD5校验,默认启用。
+//
+// isEnableMD5 true启用MD5校验,false不启用MD5校验,默认true
+//
+func EnableMD5(isEnableMD5 bool) ClientOption {
+	return func(client *Client) {
+		client.Config.IsEnableMD5 = isEnableMD5
+	}
+}
+
 // Private
 func (client Client) do(method, bucketName, urlParams, subResource string,
 	headers map[string]string, data io.Reader) (*Response, error) {

+ 2 - 0
oss/conf.go

@@ -24,6 +24,7 @@ type Config struct {
 	SecurityToken   string      // STS Token
 	IsCname         bool        // Endpoint是否是CNAME
 	HTTPTimeout     HTTPTimeout // HTTP的超时时间设置
+	IsEnableMD5     bool        // 上传数据时是否启用MD5校验
 }
 
 // 获取默认配置
@@ -39,6 +40,7 @@ func getDefaultOssConfig() *Config {
 	config.Timeout = 60 // seconds
 	config.SecurityToken = ""
 	config.IsCname = false
+	config.IsEnableMD5 = true
 
 	config.HTTPTimeout.ConnectTimeout = time.Second * 30   // 30s
 	config.HTTPTimeout.ReadWriteTimeout = time.Second * 60 // 60s

+ 2 - 1
oss/conn.go

@@ -110,7 +110,7 @@ func (conn Conn) handleBody(req *http.Request, body io.Reader) {
 	req.Header.Set(HTTPHeaderContentLength, strconv.FormatInt(req.ContentLength, 10))
 
 	// md5
-	if req.Body != nil {
+	if req.Body != nil && conn.config.IsEnableMD5 {
 		buf, _ := ioutil.ReadAll(req.Body)
 		req.Body = ioutil.NopCloser(bytes.NewReader(buf))
 		sum := md5.Sum(buf)
@@ -186,6 +186,7 @@ func serviceErrFromXML(body []byte, statusCode int, requestID string) (ServiceEr
 	}
 	storageErr.StatusCode = statusCode
 	storageErr.RequestID = requestID
+	storageErr.RawMessage = string(body)
 	return storageErr, nil
 }
 

+ 2 - 2
oss/download.go

@@ -143,7 +143,7 @@ func getDownloadPart(bucket *Bucket, objectKey string, partSize int64) ([]downlo
 
 // 并发无断点续传的下载
 func (bucket Bucket) downloadFile(objectKey, filePath string, partSize int64, options []Option, routines int) error {
-	// 如果文件不存在则创建
+	// 如果文件不存在则创建,存在不清空,下载分片会重写文件内容
 	fd, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0660)
 	if err != nil {
 		return err
@@ -348,7 +348,7 @@ func (bucket Bucket) downloadFileWithCp(objectKey, filePath string, partSize int
 		os.Remove(cpFilePath)
 	}
 
-	// 文件不存在创建
+	// 如果文件不存在创建,存在不清空,下载分片会重写文件内容
 	fd, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0660)
 	if err != nil {
 		return err

+ 2 - 1
oss/error.go

@@ -14,12 +14,13 @@ type ServiceError struct {
 	Message    string   `xml:"Message"`   // OSS给出的详细错误信息
 	RequestID  string   `xml:"RequestId"` // 用于唯一标识该次请求的UUID
 	HostID     string   `xml:"HostId"`    // 用于标识访问的OSS集群
+	RawMessage string   // OSS返回的原始消息内容
 	StatusCode int      // HTTP状态码
 }
 
 // Implement interface error
 func (e ServiceError) Error() string {
-	return fmt.Sprintf("oss: service returned error: StatusCode=%d, ErrorCode=%s, ErrorMessage=%s, RequestId=%s",
+	return fmt.Sprintf("oss: service returned error: StatusCode=%d, ErrorCode=%s, ErrorMessage=%s, RequestId=%s", 
 		e.StatusCode, e.Code, e.Message, e.RequestID)
 }
 

+ 3 - 3
sample/get_object.go

@@ -82,16 +82,16 @@ func GetObjectSample() {
 	if err != nil {
 		HandleError(err)
 	}
-	md5 := meta.Get(oss.HTTPHeaderEtag)
+	etag := meta.Get(oss.HTTPHeaderEtag)
 	// 校验内容,约束条件满足,执行下载。
-	body, err = bucket.GetObject(objectKey, oss.IfMatch(md5))
+	body, err = bucket.GetObject(objectKey, oss.IfMatch(etag))
 	if err != nil {
 		HandleError(err)
 	}
 	body.Close()
 
 	// 校验内容,约束条件不满足,不执行下载。
-	body, err = bucket.GetObject(objectKey, oss.IfNoneMatch(md5))
+	body, err = bucket.GetObject(objectKey, oss.IfNoneMatch(etag))
 	if err == nil {
 		HandleError(err)
 	}