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博客
相关文章:
golang下载、上传文件MD5高效计算方法,利用io.TeeReader函数特性 实时计算文件md5签名
在go语言的开发中,当我们在操作下载或者上传文件对象时, 我们可以利用golang内置的io包中的 TeeReader函数特性,高效实时计算文件的md5值。 方法如下: TeeReader高效计算文件md5示例 保存上传文件,并使用文件的md5签…...
TreeMap实现根据值比较
前言: TreeMap普通的排序方法都是根据键来比较来排序,本篇文章实现两种方式实现值排序 1.使用 SortedSet 和 Stream API 如果你想要一个持久化的排序结果,你可以使用 SortedSet 结构来存储键值对的条目。 TreeSet<Map.Entry<String, …...
2024前端面试(内容持续更新)
Vue篇 data为什么是个函数? 在Vue中,data必须是一个函数,这是因为当data是函数时,每个组件实例化时都会调用该函数,返回一个新的数据对象,从而保证每个组件实例拥有独立的数据,避免数据冲…...
接口基础知识5:详解request headers(一篇讲完常见字段)
课程大纲 一、请求头的定义 HTTP请求头部(HTTP Request Headers):HTTP协议中的一部分,用于在客户端和服务器之间传递附加信息。这些头部字段提供了关于请求、客户端环境、或请求的上下文的信息。 请求头是键值对的形式ÿ…...
mac的node使用
查看当前Node和npm版本 node -v npm -v安装"n"版本管理工具 sudo npm install -g n 更新node版本 sudo n stable // 稳定版本 sudo n lts // 最新稳定版本 sudo n latest // 最新版本 sudo n xx.xx // 更新到指定版本查看node版本安装集合 n ls切换对应node版…...
HTML - 简易版打字练习
1. 赛博朋克风格的视觉设计 颜色与渐变:通过linear-gradient设置了背景的颜色渐变,使用高饱和度的霓虹色彩(如橙色、绿色和蓝色)来营造赛博朋克的视觉效果。这种配色方案是赛博朋克风格的典型元素。 立体感和阴影:使用…...
【生成式人工智能-四-chatgpt的训练过程-pretrain预训练自督导式学习督导式学习】
大模型是怎么被训练出来的具有人类智慧的 阶段一训练-自我学习-具备知识训练资料self-supervised learning(自督导式学习) 阶段二-怎么让模型具备人的智慧supervised learning 督导式学习预训练pretrain为什么要用预训练的模型?Adapter逆向工…...
期权价格的奥秘:深入理解影响因素
在金融市场中,期权作为一种衍生工具,为投资者提供了风险管理和资产增值的多种可能性。期权价格的波动往往令人着迷,但其背后的定价机制却充满了复杂性。本文将带您探索期权价格变化的奥秘,并尝试以浅显易懂的方式,解析…...
STM32-USART时序与寄存器状态分析
一、时序分析 在UART(通用异步收发传输)通信中,信号线上的状态分为两种:逻辑1(高电平)和逻辑0(低电平)。在空闲状态下,数据线应保持逻辑高电平。UART协议中的各个信号位具…...
从零安装pytorch并在pycharm中使用
背景介绍 目前主流使用的工具有Facebook搞的pythorch和谷歌开发的tensorflow两种,二者在实现理念上有一定区别,pytorch和人的思维模式与变成习惯更像,而tensorflow则是先构建整体结构,然后整体运行,开发调试过程较为繁…...
开源AI工具FastGPT和RagFlow对比
FastGPT和RagFlow都是基于大型语言模型(LLM)的先进AI系统,它们在多个方面有着各自的特点和优势。 以下是对两者性能的详细对比: 一、系统架构与功能 FastGPT: 数据收集:通过从互联网上收集大量的文本数…...
第N2周:NLP中的数据集构建
对于初学者,NLP中最烦人的问题之一就数据集的构建问题,处理不好就会引起shape问题(各种由于shape错乱导致的问题)。这里给出一个模版,大家可根据这个模版来构建。 torch.utils.data是PyTorch中用于数据加载和预处理的…...
AI助力浮雕创作!万物皆可浮雕?Stable Diffusion AI绘画【浮雕艺术】之文生浮雕!
前言 对于浮雕艺术,其实并不了解。但有幸能和“细辛”前辈结识,对浮雕有了简单的了解,浮雕图案的传统方式是先由画师画出图,然后由雕刻师雕刻。画师画图归为浮雕的设计阶段,画师会绘制出浮雕的设计图,这为…...
你觉得大模型时代该出现什么?
大模型的概念都火了两年了,之前各种媒体吹嘘大模型的出现是类似“蒸汽机时代”、“iPhone时刻”等等。那为什么我们期待的结果都没出现呢?咱们先一起回顾下历史。 1、蒸汽机时代 1.1、蒸汽机历史 许多人都在讨论大模型时代好像只是概念在火࿰…...
JS【详解】事件委托
事件委托的简介 事件委托(Event Delegation)是 JS 处理事件的一种技术:不直接在目标元素上设置事件监听器,而是在其父元素或祖先元素上设置监听器,然后利用事件冒泡机制来捕获和处理事件。 事件委托的好处 减少内存占用…...
谈对象系列:C++类和对象
文章目录 一、类的定义1.1类定义的格式类的两种定义方法结构体: 1.2访问限定符1.3类域 二、实例化2.1变量的声明和定义2.2类的大小计算空类的大小(面试): 三、this指针小考题 一、类的定义 1.1类定义的格式 使用class关键字&…...
设计模式20-备忘录模式
设计模式20-备忘录 动机定义与结构定义结构 C代码推导优缺点应用场景总结备忘录模式和序列化备忘录模式1. **动机**2. **实现方式**3. **应用场景**4. **优点**5. **缺点** 序列化1. **动机**2. **实现方式**3. **应用场景**4. **优点**5. **缺点** 对比总结 动机 在软件构建过…...
绘制echarts-liquidfill水球图
文章目录 一、效果图二、步骤1.安装插件2.引入2.主要代码2.素材图片 总结 一、效果图 二、步骤 1.安装插件 npm install echarts npm install echarts-liquidfillecharts5的版本与echarts-liquidfill3兼容,echarts4的版本与echarts-liquidfill2兼容,安装的时候需要…...
应急响应:D盾的简单使用.
什么是应急响应. 一个组织为了 应对 各种网络安全 意外事件 的发生 所做的准备 以及在 事件发生后 所采取的措施 。说白了就是别人攻击你了,你怎么把这个攻击还原,看看别人是怎么攻击的,然后你如何去处理,这就是应急响应。 D盾功…...
c语言第14天笔记
通过指针引用数组 数组元素的指针 数组指针:数组中的第一个元素的地址,也就是数组的首地址。 指针数组:用来存放数组元素地址的数组,称之为指针数组。 注意:虽然我们定义了一个指针变量接收了数组地址,但…...
Winbond W25N/W25M系列SPI NAND Flash驱动开发指南
1. Winbond W25N系列SPI NAND Flash驱动库技术解析Winbond W25N系列(含W25N01GV、W25N02GV等)与W25M系列(如W25M02GW双芯片封装)是工业级高可靠性SPI NAND Flash存储器,广泛应用于嵌入式系统中替代传统并行NAND或eMMC方…...
第三届“数信杯”数据安全大赛wp之数据恢复
第三届“数信杯”数据安全大赛wp之数据恢复 缘起 先说实话,这道题比赛时没做出来😴 RSA题目一直是我的软肋,一般我都是放到最后去碰运气,这道题也是我第一次遇到,想借这次机会好好学习一下。 这里有2个基本概念&am…...
5分钟搞定OpenClaw+千问3.5-27B:星图平台镜像一键体验方案
5分钟搞定OpenClaw千问3.5-27B:星图平台镜像一键体验方案 1. 为什么选择云端沙盒方案 上周我尝试在本地笔记本上部署OpenClaw时,被各种环境依赖和权限问题折磨了整整两天。当看到星图平台提供预装OpenClaw和千问3.5-27B的完整镜像时,简直像…...
GD32F407标准库工程创建全流程:从官网固件库下载到Keil5编译通过
GD32F407标准库工程创建全流程:从官网固件库下载到Keil5编译通过 第一次接触GD32F407开发板时,最让人头疼的就是如何快速搭建开发环境。与STM32不同,GD32的官方资源分散,标准库文件结构复杂,新手很容易在文件复制和工程…...
AI编码狂飙,安全防线告急:运行时测试如何守住软件安全的生死线
2026年初,国内某头部电商平台爆发大规模用户数据泄露事件,溯源结果震惊整个行业:事件根源并非黑客的0day漏洞攻击,而是开发团队通过AI编码工具生成的一段会员权限校验代码。这段代码在语法层面完全合规,静态安全扫描全…...
嵌入式开发中GNU C扩展特性解析与应用
1. 嵌入式开发中的C语言选择困境作为一名在嵌入式领域摸爬滚打多年的工程师,我深刻理解C语言在这个领域无可替代的地位。但很多刚入行的朋友可能不知道,我们日常使用的"Linux C"和教科书上的"标准C"其实存在不少差异。第一次看到GNU…...
AI率降完又反弹原因在这里解决方案也在
论文AI率降到15%,隔了一周再测,又变成了24%。 这个情况不是你的错,也不是工具骗你,而是有几个实际原因导致的。这篇文章解释清楚原因,然后给解决方案。 AI率反弹的3个真实原因 原因一:检测系统更新了 这…...
CCF推荐C类会议与期刊全景解析:计算机网络研究者的学术地图
1. CCF推荐C类会议与期刊:计算机网络研究者的学术指南针 刚进入计算机网络领域的研究生常常会面临一个困惑:面对海量的学术会议和期刊,到底该从哪里入手?中国计算机学会(CCF)推荐的C类会议和期刊就像一张精…...
终极EdgeRemover指南:专业卸载Windows Edge浏览器的完整解决方案
终极EdgeRemover指南:专业卸载Windows Edge浏览器的完整解决方案 【免费下载链接】EdgeRemover PowerShell script to remove Microsoft Edge in a non-forceful manner. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover EdgeRemover是一款专业的P…...
新手必看,用快马生成的示例代码轻松学懂stm32f103c8t6引脚配置
作为一个刚接触STM32的开发者,我完全理解新手面对芯片引脚配置时的困惑。最近在InsCode(快马)平台尝试生成STM32F103C8T6的示例代码时,发现它特别适合用来建立引脚功能与代码的映射关系。下面分享我的学习过程: 理解芯片引脚特性 STM32F103C…...
