gitee.com/h79/goutils@v1.22.10/common/file/alyoss/file.go (about) 1 package alyoss 2 3 import ( 4 fileconfig "gitee.com/h79/goutils/common/file/config" 5 "gitee.com/h79/goutils/common/file/tools" 6 "gitee.com/h79/goutils/common/logger" 7 "gitee.com/h79/goutils/common/result" 8 "github.com/aliyun/aliyun-oss-go-sdk/oss" 9 "io" 10 "os" 11 ) 12 13 // FileUpload 文件上传 14 func (of *OssFile) FileUpload(fileResult *fileconfig.Result, data *fileconfig.Base, bucket *oss.Bucket) error { 15 16 fd, err := os.Open(data.FileName) 17 defer fd.Close() 18 19 if err != nil { 20 return result.Errorf(result.ErrUpload, "[File]open file size : %s", err) 21 } 22 23 f, err := fd.Stat() 24 if err != nil { 25 return result.Errorf(result.ErrUpload, "[File]file stat %s", err) 26 } 27 28 if f.Size() <= of.config.MinChunkSize { 29 //直接文件上传 30 err = bucket.PutObjectFromFile(data.Key, data.FileName) 31 if err != nil { 32 return result.Errorf(result.ErrUpload, "[File]Bucket put file %s", err) 33 } 34 return nil 35 } 36 37 //分片处理 38 imur, err := bucket.InitiateMultipartUpload(data.Key) 39 if err != nil { 40 return result.Errorf(result.ErrUpload, "[File]Bucket InitiateMultipartUpload %s", err) 41 } 42 43 chunks := tools.Chunk(f.Size(), tools.ChunkNum(f.Size(), of.config.MinChunkSize)) 44 45 // 对每个分片调用UploadPart方法上传。 46 var parts []oss.UploadPart 47 for _, chunk := range chunks { 48 _, err := fd.Seek(chunk.Offset, io.SeekStart) 49 if err != nil { 50 return result.Errorf(result.ErrUpload, "[File]Bucket part file seek %s", err) 51 } 52 part, err := bucket.UploadPart(imur, fd, chunk.Size, chunk.Number) 53 if err != nil { 54 return result.Errorf(result.ErrUpload, "[File]Bucket part file %s", err) 55 } 56 parts = append(parts, part) 57 } 58 // 完成分片上传 59 cmur, err := bucket.CompleteMultipartUpload(imur, parts) 60 if err != nil { 61 return result.Errorf(result.ErrUpload, "[File]Bucket complete part %s", err) 62 } 63 logger.Info("Upload: Complete part %v", cmur) 64 return nil 65 }