登录
首页 >  Golang >  Go教程

Golang文件上传进度监控实现方法

时间:2025-11-22 21:46:09 119浏览 收藏

还在为Golang文件上传进度监控而烦恼吗?本文为你提供一套实用的解决方案,完美契合百度SEO优化需求。通过自定义 `ProgressReader` 包装文件流,在读取过程中实时统计已上传字节数,并触发回调函数更新进度,轻松实现Golang文件上传进度显示。文章详细讲解了如何利用 `multipart` 上传构建带进度的HTTP请求,以及如何使用带进度的Reader包装原始文件,并附带完整示例代码,助你快速掌握Golang文件上传进度监控技巧,提升用户体验。无论你是客户端主动上传还是服务端接收文件,都能从中找到适合你的方法。

答案:通过自定义ProgressReader包装文件流,在读取时实时统计已上传字节数并回调更新进度,结合multipart上传实现Golang文件上传进度显示。

如何在Golang中实现文件上传进度显示

在Golang中实现文件上传进度显示,关键在于监控上传过程中已发送的数据量。标准的 net/http 包本身不提供进度回调机制,因此需要通过自定义 io.Reader 来实现对数据读取过程的拦截和统计。

1. 使用带进度的Reader包装原始文件

核心思路是创建一个包装了原文件的 io.Reader,在每次读取时更新已上传字节数,并调用回调函数显示进度。

示例代码:

package main

import (
    "fmt"
    "io"
    "mime/multipart"
    "net/http"
    "os"
    "sync"
)

// ProgressReader 记录上传进度
type ProgressReader struct {
    file     *os.File
    total    int64
    read     int64
    callback func(read, total int64)
    mu       sync.Mutex
}

func (pr *ProgressReader) Read(p []byte) (n int, err error) {
    n, err = pr.file.Read(p)
    pr.mu.Lock()
    pr.read += int64(n)
    pr.callback(pr.read, pr.total)
    pr.mu.Unlock()
    return n, err
}

func (pr *ProgressReader) Close() error {
    return pr.file.Close()
}

2. 构造带进度的HTTP请求

使用 multipart/form-data 格式上传文件,在构建请求体时将原始文件替换为 ProgressReader

func uploadFileWithProgress(filepath, url string) error {
    file, err := os.Open(filepath)
    if err != nil {
        return err
    }
    defer file.Close()

    fileInfo, _ := file.Stat()
    total := fileInfo.Size()

    body := &bytes.Buffer{}
    writer := multipart.NewWriter(body)

    // 创建带进度的Reader
    progressReader := &ProgressReader{
        file:  file,
        total: total,
        callback: func(read, total int64) {
            fmt.Printf("\r上传进度: %d/%d (%.2f%%)", 
                read, total, float64(read)/float64(total)*100)
        },
    }

    part, err := writer.CreateFormFile("upload", filepath)
    if err != nil {
        return err
    }

    _, err = io.Copy(part, progressReader)
    if err != nil {
        return err
    }
    writer.Close()

    req, err := http.NewRequest("POST", url, body)
    if err != nil {
        return err
    }
    req.Header.Set("Content-Type", writer.FormDataContentType())

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return err
    }
    defer resp.Body.Close()

    fmt.Println("\n上传完成")
    return nil
}

3. 调用上传函数

只需调用封装好的函数即可看到实时进度输出。

func main() {
    err := uploadFileWithProgress("./example.zip", "https://httpbin.org/post")
    if err != nil {
        fmt.Println("上传失败:", err)
    }
}

这种方式适用于客户端主动上传文件的场景。如果是在服务端接收大文件并想通知前端进度,则需结合数据库或Redis记录状态,并通过WebSocket或轮询方式推送进度。

基本上就这些,核心就是用一个中间层Reader来“监听”数据流动。

理论要掌握,实操不能落!以上关于《Golang文件上传进度监控实现方法》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>