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  }