Go语言 使用OCI传输包跟踪上传进度

kknvjkwl  于 2023-10-14  发布在  Go
关注(0)|答案(1)|浏览(137)

我正试图设置一个文件上传到OCI对象存储,它是工作正常到目前为止,但我不能告诉上传的当前进度。
我的函数看起来像这样:

uploadObjectStorage := func(filePath, fileName string) {
        file, err := os.Open(filePath)

        if err != nil {
            panic("Could not open file for read")
        }

        ociUploadRequest := transfer.UploadRequest{
            NamespaceName: oci_namespace,
            BucketName:    oci_bucketname,
            ObjectName:    common.String(fileName),
            RequestMetadata: common.RequestMetadata{
                RetryPolicy: &oci_retry,
            },
        }

        req := transfer.UploadStreamRequest{
            UploadRequest: ociUploadRequest,
            StreamReader:  file,
        }

        _, err = transfer.NewUploadManager().UploadStream(context.Background(), req)

        if err != nil {
            panic(err)
        }
    }

有一种类型叫做transfer. calladCallBack“,它在Part成功上传后被调用”,但是我没有设法让它工作。

  • Go版本go1.21.1
  • windows/amd64
  • oci-go-sdk版本v65.49.1
sr4lhrrt

sr4lhrrt1#

我不能用transfer.UploadCallBack来做,但是经过一些搜索,我发现了一个how to track a download progress的例子,它也可以上传!
我是这样做的:
首先创建一个结构来跟踪当前进度和总文件大小,并创建一个函数来打印当前百分比

type Progress struct {
    // current progress
    Current int64
    // total file size
    Total int64
}
// Print progress
func (wc *Progress) Write(p []byte) (int, error) {
    n := len(p)
    wc.Current += int64(n)
    fmt.Printf("Uploading... %.2f%%", float64(wc.Current)/float64(wc.Total)*100)
    return n, nil
}

打开文件后,将文件的总大小传递给结构

// file is a *os.File from os.Open() return
stats, err := (file.Stat())
// error handling
progressRead := &Progress{
    Total: stats.Size(),
}

然后在transfer.UploadStreamRequestStreamReader字段上使用io.TeeReader

req := transfer.UploadStreamRequest{
        UploadRequest: ociUploadRequest,
        StreamReader:  io.TeeReader(file, progressRead),
    }

相关问题