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

【四、http】go的http的文件下载

一、日常下载图片到本地

//下载文件func downloadfile(url, filename string) {r, err := http.Get(url)if err != nil {fmt.Println("err", err.Error())}defer r.Body.Close()f, err := os.Create(filename)if err != nil {fmt.Println("err", err.Error())}defer f.Close()n, err := io.Copy(f, r.Body)fmt.Println(n, err)
}func main() {var url = "https://img-s-msn-com.akamaized.net/tenant/amp/entityid/AA1jjNfg.img?w=1920&h=1080&q=60&m=2&f=jpg"downloadfile(url, "test.jpg")
}

这里以一张图片为例子

在这里插入图片描述
从后台可以看到图片的url地址

修改main函数中的url地址,可以下载到本地

结果如下
在这里插入图片描述

二、显示文件下载进度

package mainimport ("fmt""io""net/http""os"
)func downloadFile(url, filename string) {r, err := http.Get(url)if err != nil {panic(err)}defer func() {_ = r.Body.Close()}()f, err := os.Create(filename)if err != nil {panic(err)}defer func() {_ = f.Close()}()n, err := io.Copy(f, r.Body)fmt.Println(n, err)
}type Reader struct {io.ReaderTotal int64Current int64
}func (r *Reader) Read(p []byte) (n int, err error){n, err = r.Reader.Read(p)r.Current += int64(n)fmt.Printf("\r进度 %.2f%%", float64(r.Current * 10000/ r.Total)/100)return
}func DownloadFileProgress(url, filename string) {r, err := http.Get(url)if err != nil {panic(err)}defer func() {_ = r.Body.Close()}()f, err := os.Create(filename)if err != nil {panic(err)}defer func() {_ = f.Close()}()reader := &Reader{Reader: r.Body,Total: r.ContentLength,}_, _ = io.Copy(f, reader)
}func main() {// 自动文件下载,比如自动下载图片、压缩包url := "https://user-gold-cdn.xitu.io/2019/6/30/16ba8cb6465a6418?w=826&h=782&f=png&s=279620"filename := "poloxue.png"DownloadFileProgress(url, filename)
}

io.copy函数实现原理

func Copy(dst Writer, src Reader) (written int64, err error) {// Copy 函数 调用了 copyBuffer 函数来实现return copyBuffer(dst, src, nil)
}func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {// 如果 源Reader 实现了 WriterTo 接口,直接调用该方法 将数据写入到 目标Writer 当中if wt, ok := src.(WriterTo); ok {return wt.WriteTo(dst)}// 同理,如果 目标Writer 实现了 ReaderFrom 接口,直接调用ReadFrom方法if rt, ok := dst.(ReaderFrom); ok {return rt.ReadFrom(src)}// 如果没有传入缓冲区,此时默认 创建一个 缓冲区if buf == nil {// 默认缓冲区 大小为 32kbsize := 32 * 1024// 如果源Reader 为LimitedReader, 此时比较 可读数据数 和 默认缓冲区,取较小那个if l, ok := src.(*LimitedReader); ok && int64(size) > l.N {if l.N < 1 {size = 1} else {size = int(l.N)}}buf = make([]byte, size)}for {// 调用Read方法 读取数据nr, er := src.Read(buf)if nr > 0 {// 将数据写入到 目标Writer 当中nw, ew := dst.Write(buf[0:nr])// 判断写入是否 出现了 错误if nw < 0 || nr < nw {nw = 0if ew == nil {ew = errInvalidWrite}}// 累加 总写入数据written += int64(nw)if ew != nil {err = ewbreak}// 写入字节数 小于 读取字节数,此时报错if nr != nw {err = ErrShortWritebreak}}if er != nil {if er != EOF {err = er}break}}return written, err
}func Copy(dst Writer, src Reader) (written int64, err error) {// Copy 函数 调用了 copyBuffer 函数来实现return copyBuffer(dst, src, nil)
}func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {// 如果 源Reader 实现了 WriterTo 接口,直接调用该方法 将数据写入到 目标Writer 当中if wt, ok := src.(WriterTo); ok {return wt.WriteTo(dst)}// 同理,如果 目标Writer 实现了 ReaderFrom 接口,直接调用ReadFrom方法if rt, ok := dst.(ReaderFrom); ok {return rt.ReadFrom(src)}// 如果没有传入缓冲区,此时默认 创建一个 缓冲区if buf == nil {// 默认缓冲区 大小为 32kbsize := 32 * 1024// 如果源Reader 为LimitedReader, 此时比较 可读数据数 和 默认缓冲区,取较小那个if l, ok := src.(*LimitedReader); ok && int64(size) > l.N {if l.N < 1 {size = 1} else {size = int(l.N)}}buf = make([]byte, size)}for {// 调用Read方法 读取数据nr, er := src.Read(buf)if nr > 0 {// 将数据写入到 目标Writer 当中nw, ew := dst.Write(buf[0:nr])// 判断写入是否 出现了 错误if nw < 0 || nr < nw {nw = 0if ew == nil {ew = errInvalidWrite}}// 累加 总写入数据written += int64(nw)if ew != nil {err = ewbreak}// 写入字节数 小于 读取字节数,此时报错if nr != nw {err = ErrShortWritebreak}}if er != nil {if er != EOF {err = er}break}}return written, err
}

从中可以看出,io.copy函数是通过read读取文件进行写入新创建的文件,因此,重写后的read函数除了实现原来的read功能,还增加了进度条功能。

相关文章:

【四、http】go的http的文件下载

一、日常下载图片到本地 //下载文件func downloadfile(url, filename string) {r, err : http.Get(url)if err ! nil {fmt.Println("err", err.Error())}defer r.Body.Close()f, err : os.Create(filename)if err ! nil {fmt.Println("err", err.Error())…...

Java web(六):FilterListenerAJAX

文章目录 一、Filter1.1 基本介绍1.2 过滤器的执行流程1.3 拦截路径配置1.4 过滤器链1.5 案例 二、Listener三、AJAX3.1 快速入门3.2 Axios异步框架 四、 JSON4.1 JSON基础语法4.2 Fastjson 五、 案例JSONAxiosServlet Java web的三大组件&#xff1a;Servlet、Filter、Listene…...

初识jQuery

文章目录 一、jQuery介绍二、Jquery优势三、jQuery版本四、jQuery对象jQuery的引用js代码与jQuery代码对比标签对象与jQuery对象 五、jQuery查找标签1.基本选择器2.组合选择器3.层次选择器4.属性选择器5.基本筛选器6.表单筛选器 六、筛选器方法七、操作标签1.class操作2.文本操…...

MATLAB算法实战应用案例精讲-【图像处理】计算机视觉(最终篇)

目录 知识储备 线阵相机调试 1.相机型号参数 2.相机软件安装 3.编码器连接方式 4.采集卡说明...

repo执行出现/usr/bin/env: ‘python’: No such file or directory问题

下载 Repo 工具&#xff0c;并确保它可执行&#xff1a; curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod ax ~/bin/repo 执行 repo version报错&#xff1a; $ repo version /usr/bin/env: ‘python’: No such file or directory查看c…...

算法模板之单调栈解密 | 图文详解

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;算法模板、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️单调栈讲解1.1 &#x1f514;单调栈的定义1.2 &#x1f514;如何维护一个单…...

187.重复的 DNA 序列

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;187. 重复的DNA序列 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 使用两个哈希表&#xff0c;一个存放已遍历过的长度为 10 的字符串&#xff0c;另一个存放重复的长度为 10 的字符串。顺…...

Sentinel黑白名单授权规则解读

目录 基本介绍 代码实战 架构说明 RequestOriginParser的实现类 网关添加请求头 配置授权规则 基本介绍 授权规则可以对请求方来源做判断和控制。 很多时候&#xff0c;我们需要根据调用来源来判断该次请求是否允许放行&#xff0c;这时候可以使用 Sentinel 的来源…...

Spring底层原理学习笔记--第二讲--(BeanFactory实现与ApplicaitonContext实现)

BeanFactory实现 package com.lucifer.itheima.a02;import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.fac…...

云原生|kubernetes |kubelet服务加入系统守护进程supervisor(centos7系统下演示通过)

前言&#xff1a; kubelet 是 Kubernetes 集群中的一个重要组件&#xff0c;运行在每个节点上&#xff0c;负责管理该节点上的容器和Pod。它与控制平面&#xff08;如 API Server 和 kube-controller-manager&#xff09;通信&#xff0c;确保节点上的容器与期望的状态保持一致…...

onnx 模型加载部署运行方式

1.通过文件路径的onnx模型加载方式: 在onnxruntime下面的主要函数:session Ort::Session(env, w_modelPath.c_str(), sessionOptions); 这里的文件路径是宽字节的&#xff0c;通过onnx文件路径直接加载模型。 在opencv下使用dnn加载onnx模型的主要函数: std::string model…...

第68讲:MySQL触发器的核心概念以及常见的触发类型应用案例

文章目录 1.触发器的概念2.触发器操作的语法结构3.各类触发器的典型应用案例3.1.需求描述以及实现思路3.2.创建日志表3.3.INSERT类型的触发器3.4.UPDATE类型的触发器3.5.DELETE类型的触发器 1.触发器的概念 触发器是与表中数据相关的数据库对象&#xff0c;当表中的数据产生in…...

VS Code 开发 Spring Boot 类型的项目

在VS Code中开发Spring Boot的项目&#xff0c; 可以导入如下的扩展&#xff1a; Spring Boot ToolsSpring InitializrSpring Boot Dashboard 比较建议的方式是安装Spring Boot Extension Pack&#xff0c; 这里面就包含了上面的扩展。 安装方式就是在扩展查找 “Spring Boot…...

数据中心加密:保障数据安全的重要一环

随着信息化的快速发展&#xff0c;数据已经成为企业的重要资产&#xff0c;数据安全也成为了企业面临的重大挑战。数据中心作为企业数据存储和管理的重要场所&#xff0c;其安全性对于整个企业的数据安全具有至关重要的作用。而数据中心加密则是保障数据安全的重要一环。本文将…...

分享90个节日庆典PPT,总有一款适合您

分享90个节日庆典PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付费甚欢喜&#xff0c;为咱码农谋福利…...

Python Faker批量生成测试数据

一、前言 在做自动化测试或压力测试时会需要大批量生成测试数据&#xff0c;简单的方式你可以写一个存储过程使用随机函数来生成记录&#xff0c;但这种生成数据看起来不够真实&#xff0c;其实有蛮多现成的工具可以完成这一任务。 二、Faker基本使用介绍 faker是一个生成伪…...

Docker-compose 运行MySQL 连接不上

Docker-compose 运行MySQL 连接不上 📔 千寻简笔记介绍 千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes,包含笔记源文件.md,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳,如果文章对你有帮助请帮我点一个Star~ 更新:支持在线阅读文章,根据发布日期分类…...

Educational Codeforces Round 2 D 计算几何

题目链接&#xff1a;Educational Codeforces Round 2 D 题目 给你两个圆。求它们相交处的面积。 输入 第一行包含三个整数 x1, y1, r1 (  - 109 ≤ x1, y1 ≤ 109, 1 ≤ r1 ≤ 109 ) - 第一个圆的圆心位置和半径。 第二行包含三个整数 x2, y2, r2 (  …...

hexo博客发布换电脑换地方了怎么办?

假如你有2台MacBook&#xff0c;一台在家&#xff0c;一台在公司。在家的hexo本地环境都搭好了&#xff0c;markdown文件等等也都放在本地source下的_posts文件夹里了。但是我过2天又想有个新文章发布&#xff0c;这时候电脑在公司&#xff0c;那么该怎么办&#xff1f; 把家里…...

最新知识付费变现小程序源码/独立后台知识付费小程序源码/修复登录接口

最新知识付费变现小程序源码&#xff0c;独立后台知识付费小程序源码&#xff0c;最新版修复登录接口。 主要功能 会员系统&#xff0c;用户登录/注册购买记录 收藏记录 基本设置 后台控制导航颜色 字体颜色 标题等设置 流量主广告开关小程序广告显示隐藏 广告主审核过审核…...

小说下载器终极指南:一站式解决100+网站小说保存难题

小说下载器终极指南&#xff1a;一站式解决100网站小说保存难题 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 在数字阅读时代&#xff0c;你是否曾因小说突然下架、网站404或网络中…...

为Alchitry Au FPGA开发板外接JTAG接口的完整指南

1. 项目概述与核心价值如果你正在使用基于Xilinx Artix-7 FPGA的Alchitry Au或Au开发板&#xff0c;并且已经厌倦了每次调试或烧录都要依赖板载的USB-JTAG桥接芯片&#xff0c;或者你的项目已经将板载USB接口挪作他用&#xff0c;那么为你的开发板外接一个独立的JTAG调试器&…...

光效崩坏?噪点泛滥?色温漂移?——Midjourney专业级光效渲染全流程校准协议,含ACEScg色彩空间适配模板

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;光效崩坏、噪点泛滥与色温漂移的系统性归因诊断 图像采集链路中出现的光效崩坏、噪点泛滥与色温漂移并非孤立现象&#xff0c;而是光学设计、传感器响应、ISP管线调度及环境耦合失配共同作用的结果。三者常呈现…...

双系统Ubuntu磁盘告急?别重装!用GParted无损扩容保姆级教程(附U盘启动盘制作)

双系统Ubuntu磁盘告急&#xff1f;别重装&#xff01;用GParted无损扩容保姆级教程&#xff08;附U盘启动盘制作&#xff09;当你在Windows和Ubuntu双系统环境下工作时&#xff0c;是否遇到过这样的窘境&#xff1a;当初安装时给Ubuntu分配的空间捉襟见肘&#xff0c;而Windows…...

轻量化部署,异地机房快速接入,多机房管理不用再大动干戈

随着业务拓展&#xff0c;不少企业、单位陆续建起异地分部机房、多区域节点机房。传统资产管理系统部署复杂、对接困难&#xff0c;异地机房接入成本高、周期长&#xff0c;改造繁琐&#xff0c;让很多运维团队望而却步&#xff0c;只能继续沿用分散人工管理&#xff0c;资产混…...

车载诊断系统(OBD)的原理、演进与未来

本文约8,167字&#xff0c;建议收藏阅读 作者 | 北湾南巷 出品 | 汽车电子与软件 引 言 在现代汽车中&#xff0c;越来越多的故障不再表现为明显的机械损坏&#xff0c;而是以“亮灯”“报码”“性能异常”等电子信号的形式出现。发动机为什么亮起故障灯&#xff1f;排放是否达…...

基于SMD与贝壳的微型音频装置:从电路设计到嵌入式开发的完整实践

1. 项目概述&#xff1a;一个藏在贝壳里的声音世界你小时候有没有捡起一个海螺壳&#xff0c;把它贴在耳边&#xff0c;然后听到里面传来“呜呜”的海风声&#xff1f;那个瞬间&#xff0c;仿佛整个海洋都被装进了小小的贝壳里。今天这个项目&#xff0c;就是把那个童年的魔法&…...

微信小程序项目实战:从npm安装Vant Weapp到解决样式冲突的完整避坑指南

微信小程序工程化实战&#xff1a;Vant Weapp集成与样式冲突解决方案全解析 第一次在小程序里引入Vant Weapp时&#xff0c;我对着满屏错位的组件样式发呆了半小时——原本优雅的按钮变成了扭曲的色块&#xff0c;表单元素叠在一起像抽象画。这不是个例&#xff0c;根据社区反…...

告别Windows卡顿!在VMware里给Kubuntu 22.04 LTS分区和安装的保姆级避坑指南

告别Windows卡顿&#xff01;在VMware里给Kubuntu 22.04 LTS分区和安装的保姆级避坑指南你是否已经厌倦了Windows系统越来越慢的启动速度、频繁的后台更新和资源占用&#xff1f;当你的电脑开始频繁卡顿&#xff0c;或许该考虑给系统来一次"减负"了。Kubuntu 22.04 L…...

别再把大模型当搜索框了:一文讲透 LLM 的基本原理、能力边界与局限性

写在前面很多人把大语言模型当成“会聊天的搜索引擎”&#xff0c;结果一上线就遇到幻觉、口径不稳、上下文丢失、成本失控。真正理解 LLM&#xff0c;要先抓住一句话&#xff1a;它是基于 Transformer 的概率生成模型&#xff0c;核心能力来自海量预训练、上下文学习与后训练对…...