gitee.com/h79/goutils@v1.22.10/common/file/alyoss/stream.go (about) 1 package alyoss 2 3 import ( 4 "fmt" 5 fileconfig "gitee.com/h79/goutils/common/file/config" 6 "gitee.com/h79/goutils/common/file/tools" 7 "gitee.com/h79/goutils/common/logger" 8 "gitee.com/h79/goutils/common/result" 9 "github.com/aliyun/aliyun-oss-go-sdk/oss" 10 "io" 11 ) 12 13 // StreamUpload 流式上传 14 func (of *OssFile) StreamUpload(fileResult *fileconfig.Result, data *fileconfig.Stream, bucket *oss.Bucket) error { 15 16 if data.Size <= of.config.MinChunkSize { 17 18 if _, err := data.Seeker.Seek(0, io.SeekStart); err != nil { 19 return result.Error(result.ErrUpload, 20 fmt.Sprintf("Stream: File Seek failure, err= %v", err)) 21 } 22 23 if err := bucket.PutObject(data.Key, data.Reader); err != nil { 24 return result.Error(result.ErrUpload, 25 fmt.Sprintf("Stream: Bucket put object failure, err= %v", err)) 26 } 27 logger.Debug("Stream: Completed put object") 28 return nil 29 } 30 return of.streamPartUpload(fileResult, data, bucket) 31 } 32 33 func (of *OssFile) streamPartUpload(fileResult *fileconfig.Result, data *fileconfig.Stream, bucket *oss.Bucket) error { 34 35 //分片处理 36 imur, err := bucket.InitiateMultipartUpload(data.Key) 37 if err != nil { 38 return result.Error(result.ErrUpload, 39 fmt.Sprintf("Stream: Bucket InitiateMultipartUpload failure, err= %v", err)) 40 } 41 fileResult.Id = imur.UploadID 42 43 chunks := tools.Chunk(data.Size, tools.ChunkNum(data.Size, of.config.MinChunkSize)) 44 45 // 对每个分片调用UploadPart方法上传。 46 var parts []oss.UploadPart 47 for _, chunk := range chunks { 48 _, er := data.Seeker.Seek(chunk.Offset, io.SeekStart) 49 if er != nil { 50 return result.Error(result.ErrUpload, 51 fmt.Sprintf("Stream: Bucket part file seek failure, err= %v", er)) 52 } 53 part, er1 := bucket.UploadPart(imur, data.Reader, chunk.Size, chunk.Number) 54 if er1 != nil { 55 return result.Error(result.ErrUpload, 56 fmt.Sprintf("Stream: Bucket part file failure, err= %v", er1)) 57 } 58 parts = append(parts, part) 59 } 60 // 完成分片上传 61 cmur, er2 := bucket.CompleteMultipartUpload(imur, parts) 62 if er2 != nil { 63 return result.Error(result.ErrUpload, 64 fmt.Sprintf("Stream: Bucket complete part failure, err= %v", er2)) 65 } 66 logger.Info("Stream: Complete part, data= %v", cmur) 67 return nil 68 }