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  }