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

在Golang中实现文件上传进度显示,关键在于监控上传过程中已发送的数据量。标准的 net/http 包本身不提供进度回调机制,因此需要通过自定义 io.Reader 来实现对数据读取过程的拦截和统计。
1. 使用带进度的Reader包装原始文件
核心思路是创建一个包装了原文件的 io.Reader,在每次读取时更新已上传字节数,并调用回调函数显示进度。
示例代码:
package mainimport ( "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. 调用上传函数
只需调用封装好的函数即可看到实时进度输出。
ReportPlus数据报表中心小程序
ReportPlust意在打造一套精美的数据报表模板,里面高度封装日历组件、表格组件、排行榜组件、条形进度条组件、文本块组件以及ucharts的多个图表组件,用户只需要按照虚拟数据的格式,传特定数据即可方便、快捷地打造出属于自己的报表页面。该小程序主要使用了ucharts和wyb-table两插件实现的数据报表功能。 特点使用的是uni-app中最受欢迎的图表uCharts插件完成图表展示,该插件
0 查看详情
立即学习“go语言免费学习笔记(深入)”;
func main() { err := uploadFileWithProgress("./example.zip", "https://httpbin.org/post") if err != nil { fmt.Println("上传失败:", err) }}
这种方式适用于客户端主动上传文件的场景。如果是在服务端接收大文件并想通知前端进度,则需结合数据库或Redis记录状态,并通过WebSocket或轮询方式推送进度。
基本上就这些,核心就是用一个中间层Reader来“监听”数据流动。
以上就是如何在Golang中实现文件上传进度显示的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1068781.html
微信扫一扫
支付宝扫一扫