当前位置: 首页 > news >正文

golang下载、上传文件MD5高效计算方法,利用io.TeeReader函数特性 实时计算文件md5签名

在go语言的开发中,当我们在操作下载或者上传文件对象时, 我们可以利用golang内置的io包中的 TeeReader函数特性,高效实时计算文件的md5值。 方法如下:

TeeReader高效计算文件md5示例

保存上传文件,并使用文件的md5签名.扩展名 作为保存文件名,再读取上传文件的同时计算文件md5签名

// 上传文件  使用文件md5签名.ext 作为文件名
func UploadFile(file *multipart.FileHeader) (string, error) {f, err := file.Open() // 读取文件if err != nil {return "", fmt.Errorf("error reading multipart file: %v", err)}defer f.Close() // 创建文件 defer 关闭// 计算文件md5 这里使用 TreeReader的特性在拷贝文件的同时 高效计算文件md5md5 := md5.New()treeReader := io.TeeReader(f, md5)fmd5 := hex.EncodeToString(md5.Sum(nil)) // 获取上传文件的md5签名字符串// 拼接目标文件 使用文件md5签名.ext 作为文件名dstFile := filepath.Join("upload", fmd5+filepath.Ext(file.Filename) )// 创建目标文件对象dst, err := os.Create(dstFile)if err != nil {return "", fmt.Errorf("error creating dst file: %v", err)}defer dst.Close() // 创建文件 defer 关闭// 从treeReader将文件拷贝到目标文件 dstif _, err = io.Copy(dst, treeReader); err != nil {return "", fmt.Errorf("error Copy file to destination: %v", err)}return dstFile, nil
}

TeeReader函数定义参考


// TeeReader returns a [Reader] that writes to w what it reads from r.
// All reads from r performed through it are matched with
// corresponding writes to w. There is no internal buffering -
// the write must complete before the read completes.
// Any error encountered while writing is reported as a read error.
func TeeReader(r Reader, w Writer) Reader {return &teeReader{r, w}
}type teeReader struct {r Readerw Writer
}func (t *teeReader) Read(p []byte) (n int, err error) {n, err = t.r.Read(p)if n > 0 {if n, err := t.w.Write(p[:n]); err != nil {return n, err}}return
}

总结:golang的io包中的这个TeeReader函数给我们提供了非常高效的文件操作的同时进行其他任务的接口,利用这个特性我们可以在保存文件的同时高效的计算文件的MD5,  也可以利用它来实时的显示文件操作进度条等。

更多使用方法参见  go语言内置io包中TreeReader函数的理解和使用示例_golang io.teereader-CSDN博客

http://www.lryc.cn/news/419481.html

相关文章:

  • TreeMap实现根据值比较
  • 2024前端面试(内容持续更新)
  • 接口基础知识5:详解request headers(一篇讲完常见字段)
  • mac的node使用
  • HTML - 简易版打字练习
  • 【生成式人工智能-四-chatgpt的训练过程-pretrain预训练自督导式学习督导式学习】
  • 期权价格的奥秘:深入理解影响因素
  • STM32-USART时序与寄存器状态分析
  • 从零安装pytorch并在pycharm中使用
  • 开源AI工具FastGPT和RagFlow对比
  • 第N2周:NLP中的数据集构建
  • AI助力浮雕创作!万物皆可浮雕?Stable Diffusion AI绘画【浮雕艺术】之文生浮雕!
  • 你觉得大模型时代该出现什么?
  • JS【详解】事件委托
  • 谈对象系列:C++类和对象
  • 设计模式20-备忘录模式
  • 绘制echarts-liquidfill水球图
  • 应急响应:D盾的简单使用.
  • c语言第14天笔记
  • 服装行业QMS中的来料检验:常见问题解析与解决策略
  • 健身动作AI识别,仰卧起坐计数(含UI界面)
  • GitHub开源金融系统:Actual
  • 【学习笔记】Day 7
  • 网络中特殊的 IP 地址
  • ASP 表单处理入门指南
  • 极米RS10Plus性价比高吗?7款4-6K价位投影仪测评哪款最好
  • RocketMQ怎么对文件进行读写的?
  • 智慧宠物护理:智能听诊器引领健康监测新潮流
  • SRE工程师第2天:我只要截图功能 而不是打开微信
  • 【RunnerGo】离线安装成功版本