新闻中心

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

2025-10-29
浏览次数:
返回列表
答案:通过自定义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. 调用上传函数

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

网奇英文商城外贸系统 网奇英文商城外贸系统

网奇Eshop是一个带有国际化语言支持的系统,可以同时在一个页面上显示全球任何一种语言而没有任何障碍、任何乱码。在本系统中您可以发现,后台可以用任意一种语言对前台进行管理、录入而没有阻碍。而任何一个国家的浏览者也可以用他们的本国语言在你的网站上下订单、留言。用户可以通过后台随意设定软件语言,也就是说你可以用本软件开设简体中文、繁体中文与英文或者其他语言的网上商店。网奇Eshop系统全部版本都使用模

网奇英文商城外贸系统 0 查看详情 网奇英文商城外贸系统

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

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

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

以上就是如何在Golang中实现文件上传进度显示的详细内容,更多请关注其它相关文章!


# 自定义  # 崇明区网站优化机构  # seo转型程序员  # 山城区seo  # 明信片推广营销方案  # 宁波seo优化要怎么做  # 合川区大数据seo优化  # 镇海区网站建设费用  # 新媒体营销 营销方式 推广技巧  # 怎么优化网站地图位置  # 网站建站推广团队  # 内存管理  # 是一个  # 上传文件  # 如何在  # 文件上传  # 可以用  # 英文  # 上传  # 回调  # red  # ai  # websocket  # 回调函数  # 字节  # golang  # go  # 前端  # redis  # 进度显示 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 微信网页版官方入口教程 微信网页版网页版快速登录步骤  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  抖音创作助手登录入口_抖音创作辅助工具官网直达  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  Django表单提交验证失败后保持字段值不刷新  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  探索高级语言到原生C/C++的转译:挑战与内存管理策略  Lar*el 递归关系中排除指定分支的教程  汽水音乐网页版使用入口_汽水音乐电脑版播放指南  iCloud登录入口网页版 苹果iCloud官网登录  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  邮政快递包裹最新位置 邮政快递实时追踪入口  怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  Composer如何在生产环境安全地执行composer update  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  优化Django表单:提交验证失败后保留用户输入  J*a里如何使用forEach遍历Map_Map遍历方法说明  163邮箱注册官网 免费申请163个人邮箱  Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】  Mac怎么查看崩溃日志_Mac控制台错误报告分析  如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  C++指针和引用有什么区别_C++内存管理核心概念深度解析  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  必由学网页版入口 必由学官方平台直接访问  在哪找SublimeJ远程工具_SFTP插件配置教程  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  C++ map遍历方法大全_C++ map迭代器使用总结  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  实现分段式页面滚动导航:CSS与J*aScript教程  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  Flexbox布局实践:实现粘性导航栏与底部固定页脚  AO3官网镜像链接 Archive of Our Own同人文在线浏览  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  ArrayList与LinkedList核心操作的Big-O复杂度分析  mc.js官网登录入口 mc.js官方登录入口最新版  Lar*el DB::listen 事件中的查询执行时间单位解析  C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略  拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  天眼查企业查询官网入口 天眼查官方网页版查询  Go语言JSON解析深度指南:动态访问与结构体映射实践  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  Win11怎么关闭快速启动_Win11彻底关机设置教程  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  快手官方唯一登录入口 谨防山寨钓鱼网站  小米Civi 4录制视频过暗_小米Civi 4亮度优化 

搜索