github.com/qiniu/go-sdk/v7@v7.27.0/storage/upload_source.go (about) 1 package storage 2 3 import ( 4 "errors" 5 "io" 6 "os" 7 ) 8 9 type UploadSource interface { 10 Size() int64 11 Rewindable() bool 12 Rewind() error 13 } 14 15 func NewUploadSourceReader(reader io.Reader, size int64) (UploadSource, error) { 16 return &uploadSourceReader{ 17 reader: reader, 18 size: size, 19 }, nil 20 } 21 22 type uploadSourceReader struct { 23 reader io.Reader 24 size int64 25 } 26 27 func (u *uploadSourceReader) Rewindable() bool { 28 return false 29 } 30 31 func (u *uploadSourceReader) Rewind() error { 32 return errors.New("resource not support rewind") 33 } 34 35 func (u *uploadSourceReader) Size() int64 { 36 return u.size 37 } 38 39 func NewUploadSourceReaderAt(reader io.ReaderAt, size int64) (UploadSource, error) { 40 if size <= 0 { 41 return nil, errors.New("source size must be set") 42 } 43 44 return &uploadSourceReaderAt{ 45 reader: reader, 46 size: size, 47 }, nil 48 } 49 50 type uploadSourceReaderAt struct { 51 reader io.ReaderAt 52 size int64 53 } 54 55 func (u *uploadSourceReaderAt) Rewindable() bool { 56 return true 57 } 58 59 func (u *uploadSourceReaderAt) Rewind() error { 60 return nil 61 } 62 63 func (u *uploadSourceReaderAt) Size() int64 { 64 return u.size 65 } 66 67 func NewUploadSourceFile(filePath string) (UploadSource, error) { 68 if fileInfo, err := os.Stat(filePath); err != nil { 69 return nil, err 70 } else { 71 return &uploadSourceFile{ 72 fileInfo: fileInfo, 73 filePath: filePath, 74 }, nil 75 } 76 } 77 78 type uploadSourceFile struct { 79 filePath string 80 fileInfo os.FileInfo 81 } 82 83 func (u *uploadSourceFile) Rewindable() bool { 84 return true 85 } 86 87 func (u *uploadSourceFile) Rewind() error { 88 return nil 89 } 90 91 func (u *uploadSourceFile) Size() int64 { 92 return u.fileInfo.Size() 93 }