| 
					
					
						
							
						
					
					
				 | 
				@ -513,7 +513,7 @@ func (s *ObjectService) DeleteMulti(ctx context.Context, opt *ObjectDeleteMultiO | 
			
		
		
	
		
			
				 | 
				 | 
				type Object struct { | 
				 | 
				 | 
				type Object struct { | 
			
		
		
	
		
			
				 | 
				 | 
					Key          string `xml:",omitempty"` | 
				 | 
				 | 
					Key          string `xml:",omitempty"` | 
			
		
		
	
		
			
				 | 
				 | 
					ETag         string `xml:",omitempty"` | 
				 | 
				 | 
					ETag         string `xml:",omitempty"` | 
			
		
		
	
		
			
				 | 
				 | 
					Size         int    `xml:",omitempty"` | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					Size         int64  `xml:",omitempty"` | 
			
		
		
	
		
			
				 | 
				 | 
					PartNumber   int    `xml:",omitempty"` | 
				 | 
				 | 
					PartNumber   int    `xml:",omitempty"` | 
			
		
		
	
		
			
				 | 
				 | 
					LastModified string `xml:",omitempty"` | 
				 | 
				 | 
					LastModified string `xml:",omitempty"` | 
			
		
		
	
		
			
				 | 
				 | 
					StorageClass string `xml:",omitempty"` | 
				 | 
				 | 
					StorageClass string `xml:",omitempty"` | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -836,35 +836,43 @@ func (s *ObjectService) Upload(ctx context.Context, name string, filepath string | 
			
		
		
	
		
			
				 | 
				 | 
					}() | 
				 | 
				 | 
					}() | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
					// 5.Recv the resp etag to complete
 | 
				 | 
				 | 
					// 5.Recv the resp etag to complete
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					err = nil | 
			
		
		
	
		
			
				 | 
				 | 
					for i := 0; i < partNum; i++ { | 
				 | 
				 | 
					for i := 0; i < partNum; i++ { | 
			
		
		
	
		
			
				 | 
				 | 
						if chunks[i].Done { | 
				 | 
				 | 
						if chunks[i].Done { | 
			
		
		
	
		
			
				 | 
				 | 
							optcom.Parts = append(optcom.Parts, Object{ | 
				 | 
				 | 
							optcom.Parts = append(optcom.Parts, Object{ | 
			
		
		
	
		
			
				 | 
				 | 
								PartNumber: chunks[i].Number, ETag: chunks[i].ETag}, | 
				 | 
				 | 
								PartNumber: chunks[i].Number, ETag: chunks[i].ETag}, | 
			
		
		
	
		
			
				 | 
				 | 
							) | 
				 | 
				 | 
							) | 
			
		
		
	
		
			
				 | 
				 | 
							consumedBytes += chunks[i].Size | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
							event = newProgressEvent(ProgressDataEvent, chunks[i].Size, consumedBytes, totalBytes) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
							progressCallback(listener, event) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
							if err == nil { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
								consumedBytes += chunks[i].Size | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
								event = newProgressEvent(ProgressDataEvent, chunks[i].Size, consumedBytes, totalBytes) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
								progressCallback(listener, event) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
							} | 
			
		
		
	
		
			
				 | 
				 | 
							continue | 
				 | 
				 | 
							continue | 
			
		
		
	
		
			
				 | 
				 | 
						} | 
				 | 
				 | 
						} | 
			
		
		
	
		
			
				 | 
				 | 
						res := <-chresults | 
				 | 
				 | 
						res := <-chresults | 
			
		
		
	
		
			
				 | 
				 | 
						// Notice one part fail can not get the etag according.
 | 
				 | 
				 | 
						// Notice one part fail can not get the etag according.
 | 
			
		
		
	
		
			
				 | 
				 | 
						if res.Resp == nil || res.err != nil { | 
				 | 
				 | 
						if res.Resp == nil || res.err != nil { | 
			
		
		
	
		
			
				 | 
				 | 
							// Some part already fail, can not to get the header inside.
 | 
				 | 
				 | 
							// Some part already fail, can not to get the header inside.
 | 
			
		
		
	
		
			
				 | 
				 | 
							err := fmt.Errorf("UploadID %s, part %d failed to get resp content. error: %s", uploadID, res.PartNumber, res.err.Error()) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
							event = newProgressEvent(ProgressFailedEvent, 0, consumedBytes, totalBytes, err) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
							progressCallback(listener, event) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
							return nil, nil, err | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
							err = fmt.Errorf("UploadID %s, part %d failed to get resp content. error: %s", uploadID, res.PartNumber, res.err.Error()) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
							continue | 
			
		
		
	
		
			
				 | 
				 | 
						} | 
				 | 
				 | 
						} | 
			
		
		
	
		
			
				 | 
				 | 
						// Notice one part fail can not get the etag according.
 | 
				 | 
				 | 
						// Notice one part fail can not get the etag according.
 | 
			
		
		
	
		
			
				 | 
				 | 
						etag := res.Resp.Header.Get("ETag") | 
				 | 
				 | 
						etag := res.Resp.Header.Get("ETag") | 
			
		
		
	
		
			
				 | 
				 | 
						optcom.Parts = append(optcom.Parts, Object{ | 
				 | 
				 | 
						optcom.Parts = append(optcom.Parts, Object{ | 
			
		
		
	
		
			
				 | 
				 | 
							PartNumber: res.PartNumber, ETag: etag}, | 
				 | 
				 | 
							PartNumber: res.PartNumber, ETag: etag}, | 
			
		
		
	
		
			
				 | 
				 | 
						) | 
				 | 
				 | 
						) | 
			
		
		
	
		
			
				 | 
				 | 
						consumedBytes += chunks[res.PartNumber-1].Size | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
						event = newProgressEvent(ProgressDataEvent, chunks[res.PartNumber-1].Size, consumedBytes, totalBytes) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
						progressCallback(listener, event) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
						if err == nil { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
							consumedBytes += chunks[res.PartNumber-1].Size | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
							event = newProgressEvent(ProgressDataEvent, chunks[res.PartNumber-1].Size, consumedBytes, totalBytes) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
							progressCallback(listener, event) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
						} | 
			
		
		
	
		
			
				 | 
				 | 
					} | 
				 | 
				 | 
					} | 
			
		
		
	
		
			
				 | 
				 | 
					close(chresults) | 
				 | 
				 | 
					close(chresults) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					if err != nil { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
						event = newProgressEvent(ProgressFailedEvent, 0, consumedBytes, totalBytes, err) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
						progressCallback(listener, event) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
						return nil, nil, err | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					} | 
			
		
		
	
		
			
				 | 
				 | 
					sort.Sort(ObjectList(optcom.Parts)) | 
				 | 
				 | 
					sort.Sort(ObjectList(optcom.Parts)) | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
					event = newProgressEvent(ProgressCompletedEvent, 0, consumedBytes, totalBytes) | 
				 | 
				 | 
					event = newProgressEvent(ProgressCompletedEvent, 0, consumedBytes, totalBytes) | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
					
				 | 
				
  |