欢迎访问宙启技术站
智能推送

Golang实现异步上传文件支持进度条查询的方法

发布时间:2023-05-17 13:25:42

Golang是一种非常适合进行并发编程的语言。在文件上传这个场景下,我们可以利用Golang的并发特性,实现异步上传文件,同时支持进度条查询的功能。

具体实现方法如下:

1. 定义一个结构体,用来存储上传文件的相关信息,包括文件名、文件大小、上传进度等字段。

type UploadFileInfo struct {
    FileName     string   // 文件名
    FileSize     int64    // 文件大小
    Progress     int64    // 上传进度
    IsFinished   bool     // 上传完成标志位
    ErrorMsg     string   // 错误信息
}

2. 定义一个上传函数,接收上传文件的相关信息,同时返回一个管道用于获取上传进度信息和错误信息。

func UploadFile(uploadFileInfo *UploadFileInfo, file io.Reader) chan error {
    progress := make(chan int64)
    errChan := make(chan error)
    done := make(chan bool)

    // 省略具体上传逻辑

    go func() {
        defer close(done)
        for {
            select {
                case <-time.After(time.Second * 1):
                    // 定时更新上传进度
                    if uploadFileInfo.IsFinished {
                        return
                    }
                    progress <- uploadFileInfo.Progress
                case <-done:
                    return
            }
        }
    }()

    // 返回进度信息和错误信息
    go func() {
        for {
            select {
                case p := <-progress:
                    fmt.Printf("\rUpload Progress: %d%%", p*100/uploadFileInfo.FileSize)
                case err := <-errChan:
                    close(progress)
                    close(errChan)
                    log.Fatal(err)
            }
        }
    }()

    return errChan
}

3. 客户端调用上传函数进行异步上传,同时通过返回的管道获取上传进度和错误信息。

uploadFileInfo := &UploadFileInfo{
    FileName: "test.jpg",
    FileSize: fileSize,
    Progress: 0,
    IsFinished: false,
    ErrorMsg: "",
}
errChan := UploadFile(uploadFileInfo, file)
for err := range errChan {
    if err != nil {
        uploadFileInfo.ErrorMsg = err.Error()
        break
    }
}

通过以上实现,我们可以方便地实现异步上传文件支持进度条查询的功能,提升文件上传体验,提高用户体验。同时,通过使用管道,我们可以更加安全地获取上传进度和错误信息,避免了数据竞争等问题。