@@ -524,10 +524,11 @@ type Object struct {
524524// MultiUploadOptions is the option of the multiupload,
525525// ThreadPoolSize default is one
526526type MultiUploadOptions struct {
527- OptIni * InitiateMultipartUploadOptions
528- PartSize int64
529- ThreadPoolSize int
530- CheckPoint bool
527+ OptIni * InitiateMultipartUploadOptions
528+ PartSize int64
529+ ThreadPoolSize int
530+ CheckPoint bool
531+ EnableVerification bool
531532}
532533
533534type Chunk struct {
@@ -738,11 +739,21 @@ func (s *ObjectService) Upload(ctx context.Context, name string, filepath string
738739 if opt == nil {
739740 opt = & MultiUploadOptions {}
740741 }
742+ var localcrc uint64
741743 // 1.Get the file chunk
742744 totalBytes , chunks , partNum , err := SplitFileIntoChunks (filepath , opt .PartSize )
743745 if err != nil {
744746 return nil , nil , err
745747 }
748+ // 校验
749+ if opt .EnableVerification {
750+ fd , err := os .Open (filepath )
751+ if err != nil {
752+ return nil , nil , err
753+ }
754+ defer fd .Close ()
755+ localcrc , err = calCRC64 (fd )
756+ }
746757 // filesize=0 , use simple upload
747758 if partNum == 0 {
748759 var opt0 * ObjectPutOptions
@@ -881,8 +892,16 @@ func (s *ObjectService) Upload(ctx context.Context, name string, filepath string
881892 v , resp , err := s .CompleteMultipartUpload (context .Background (), name , uploadID , optcom )
882893 if err != nil {
883894 s .AbortMultipartUpload (ctx , name , uploadID )
895+ return v , resp , err
884896 }
885897
898+ if resp != nil && opt .EnableVerification {
899+ scoscrc := resp .Header .Get ("x-cos-hash-crc64ecma" )
900+ icoscrc , _ := strconv .ParseUint (scoscrc , 10 , 64 )
901+ if icoscrc != localcrc {
902+ return v , resp , fmt .Errorf ("verification failed, want:%v, return:%v" , localcrc , icoscrc )
903+ }
904+ }
886905 return v , resp , err
887906}
888907
0 commit comments