github.com/qiniu/go-sdk/v7@v7.27.0/storage/resume_uploader_deprecated.go (about)

     1  package storage
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  
     7  	"github.com/qiniu/go-sdk/v7"
     8  )
     9  
    10  // 分片上传过程中可能遇到的错误
    11  var (
    12  	ErrInvalidPutProgress = errors.New("invalid put progress")
    13  	ErrPutFailed          = errors.New("resumable put failed")
    14  	ErrBadToken           = errors.New("invalid token")
    15  )
    16  
    17  const (
    18  	// 上传一个分片失败
    19  	ErrUploadChunkFailed = "ErrUploadChunkFailed"
    20  	// 取消了分片的上传
    21  	ErrChunkUpCanceled = "ErrChunkUpCanceled"
    22  )
    23  
    24  // BlockCount 用来计算文件的分块数量
    25  func BlockCount(fsize int64) int {
    26  	return int((fsize + blockMask) >> blockBits)
    27  }
    28  
    29  // 上传进度过期错误
    30  const (
    31  	InvalidCtx = 701 // UP: 无效的上下文(bput),可能情况:Ctx非法或者已经被淘汰(太久未使用)
    32  )
    33  
    34  // ChunkPutRetryer 上传分片失败时候重试接口
    35  type ChunkPutRetryer interface {
    36  	Retry(ck *Chunk)
    37  }
    38  
    39  // Chunk表示要上传的数据块, 该片的大小不能大于4M
    40  // 上传块的过程: 1. 调用接口在七牛后端创建块 2. 上传数据到该块
    41  // 详细可以参考 https://developer.qiniu.com/kodo/api/1286/mkblk
    42  type Chunk struct {
    43  	// 要上传的块数据
    44  	Body io.ReadSeeker
    45  
    46  	// 该片数据所属的块的大小
    47  	BlkSize int
    48  
    49  	// 将大的数据切成4M一块,每个块都有一个index
    50  	// 该片数据所属的块的index
    51  	Index int
    52  
    53  	// 上传该片发生的错误
    54  	Err error
    55  
    56  	// 是否调用了mkblk接口在后台创建了该片所属的块
    57  	Created bool
    58  
    59  	// 上传块的返回值
    60  	Ret *BlkputRet
    61  }
    62  
    63  // ShouldRetry 是否需要重新上传
    64  func (b *Chunk) ShouldRetry() bool {
    65  	return b.Err != nil
    66  }
    67  
    68  // BlockLength 返回实际要上传的数据的长度
    69  func (b *Chunk) ChunkLength() (int, error) {
    70  	n, err := api.SeekerLen(b.Body)
    71  	if err != nil {
    72  		return 0, err
    73  	}
    74  	return int(n), nil
    75  }
    76  
    77  // ResetBody 重置Body到开头
    78  func (b *Chunk) ResetBody() error {
    79  	_, err := b.Body.Seek(0, io.SeekStart)
    80  	return err
    81  }
    82  
    83  // Reset 重置Body和Err
    84  func (b *Chunk) Reset() error {
    85  	err := b.ResetBody()
    86  	if err != nil {
    87  		return err
    88  	}
    89  	b.Err = nil
    90  	return nil
    91  }