目录

  • 前言
  • 一、Seek介绍
  • 二、Seek的使用
    • 1.SeekStart
    • 2.SeekCurrent
    • 3.SeekEnd
  • 三、断点续传

前言

对于一些较大文件的上传下载,我们期望的是能够一次就完成,这样不仅节省时间也节省用户流量,用户体验也会更好等等。但是网络环境的不可靠性导致较大文件的传输一次就完成的把握实在不是很大,所以针对这种情况,人们就考虑能否让失败的任务在下次继续时接着传输未传输的部分,而已经传输过的则不再传输,由此,断点续传被创造出来了。


一、Seek介绍

Golang中的断点续传实现最简便的方法是借助Seek方法:

type Seeker interface {Seek(offset int64, whence int) (int64, error)
}

在断点续传中我们使用file类去读取写入文件,因为file实现了Seeker接口,通过它我们可以很方便的实现我们想要的功能。

Seek有两个参数:
1.offset 偏移量
2.whence 决定偏移量从什么地方开始
2.1 SeekStart 从头开始
2.2 SeekCurrent 从当前开始
2.3 SeekEnd 从末尾开始

二、Seek的使用

根据D:\test.txt文件来测试Seek函数中whence参数的作用:

1.SeekStart

代码如下:

fileName := "D:\\test.txt"
file,_ := os.OpenFile(fileName,os.O_CREATE,os.ModePerm)
b := []byte{0}
file.Seek(2,io.SeekStart)
file.Read(b)
fmt.Println(string(b))

结果:

C

解释:由于SeekStart是表示offset是从头开始,所以这里从头开始偏移两位,得到第三位的数据:C

2.SeekCurrent

代码如下:

fileName := "D:\\test.txt"
file,_ := os.OpenFile(fileName,os.O_CREATE,os.ModePerm)
b := []byte{0}
file.Read(b)
file.Seek(2,io.SeekCurrent)
file.Read(b)
fmt.Println(string(b))

结果:

D

解释:由于SeekCurrent是从当前位置开始,所以当前面已经读取过一个byte之后,再偏移两位,总共偏移三位,所以得到第四位:D

3.SeekEnd

代码如下:

fileName := "D:\\test.txt"
file,_ := os.OpenFile(fileName,os.O_CREATE,os.ModePerm)
file.Seek(0,io.SeekEnd)
file.WriteString("a")

结果:

解释:由于SeekEnd是表示从末尾开始,所以写入的 a 被添加到最后。

三、断点续传

仍然使用上面的test.txt文本来进行断点续传的操作。

func duanDian() {fileName := "D:\\test.txt" //源文件destFile := "D:\\dest.txt" //下载的目标文件tempFile := "D:\\temp.txt" //临时文件(用来记录下载过的字节数)file,err := os.OpenFile(fileName,os.O_CREATE,os.ModePerm)dest, _ := os.OpenFile(destFile,os.O_CREATE|os.O_WRONLY,os.ModePerm)temp,_ := os.OpenFile(tempFile,os.O_CREATE|os.O_RDWR,os.ModePerm)defer file.Close()defer dest.Close()defer temp.Close()//首先读取临时文件中保存的已经下载过的数量temp.Seek(0,io.SeekStart)bs := make([]byte,100)n1,_ := temp.Read(bs)//读取临时文件中保存的字节数countStr := string(bs[:n1])//转换成int型count,_ := strconv.ParseInt(countStr,10,64)//得到已经下载过的进度之后同步源文件跟目标文件//偏移量为已经下载过的,我们需要继续下载的是剩下的file.Seek(count,io.SeekStart)dest.Seek(count,io.SeekStart)//定义一个byte切片,大小设置为1,因为我们的测试案例只有几个单词data := make([]byte,1)//设置变量来记录读取写入的字节数n2,n3 := -1,-1//已经写入的字节总数,用来存放到temp文件total := int(count)for {//开始读取源文件内容n2,err = file.Read(data)if err == io.EOF {fmt.Println("文件复制完毕!")temp.Close()//下载完成之后删除临时文件err = os.Remove(tempFile)if err != nil {panic(err)}break}//读取之后写入目标文件n3,_ = dest.Write(data[:n2])//更新写入的总数total += n3temp.Seek(0,io.SeekStart)temp.WriteString(strconv.Itoa(total))//这里可以测试网络中断造成的下载异常,//注释之后重新运行将会从失败的地方重新下载//if total == 2 {//    panic("网络异常,下载失败!")//}}
}

Golang断点续传相关推荐

  1. golang实现文件服务器,【Golang】实现文件服务器断点续传

    Loading... # 0x00 下载文件时暂停后可以继续接着下载,在线看视频时可以随意拖动进度条,这些都是断点续传所实现的应用. http1.1支持**Range**属性从而实现断点续传,客户端在 ...

  2. golang实现多协程下载文件(支持断点续传)

    golang实现多协程下载文件(支持断点续传) 引言 写这篇文章主要是周末休息太无聊,看了看别人代码,发现基本上要么是多协程下载文件要么就只有单协程的断点续传,所以就试了试有进度条的多协程下载文件(支 ...

  3. golang实现断点续传

    这里只展示了核心代码部分,使用了封装request和response的gin框架,若小伙伴没使用可用改成go自带的http. func SendFile(r *gin.Context) {//断点续传 ...

  4. Golang:实现断点续传(http单线程下载文件)

    package breakpointContinuationimport ("fmt""io""io/ioutil""net/ht ...

  5. Golang:实现断点续传(复制文件)

    1.将文件pic_src.jpg复制到pic_des.jpg文件: 2.读写过程中断时,读写的中断位置会记录在"pic_des.jpgtemp.txt"文件里: 3.下次再启动程序 ...

  6. golang之文件读写/复制/断点续传

    目录 一.常用读取文件的三种方式 (1)利用os和file原生操作读文件 (2)使用bufio读取文件 (3)使用ioutil读取文件 二.常用写文件的三种方式 (1)利用os和file原生操作写文件 ...

  7. Golang操作阿里云OSS上传文件

    为什么要使用OSS?应用场景是什么? 最近在开发考试系统,里面需要上传课件,课件包括pdf,map等等各种类型的文件,这些文件不能像图片一样,直接上传到项目目录下面,需要单独存放,阿里云就提供了存储方 ...

  8. minio断点续传方案

    minio断点续传方案 一.功能 二.特点 三.效果 四.详细方案 完整代码在此 完整代码在此 完整代码在此 一.功能 1.分片上传 2.断点续传 3.秒传 二.特点 1.不暴露minio敏感信息 2 ...

  9. golang 实战企业网盘

    一.功能需求 1.基于golang实现分布式文件上传服务 2.ceph和阿里云oss 3.支持断点续传和秒传功能 4.微服务化和容器部署 二.项目使用到的技术 redis mysql rabbitmq ...

最新文章

  1. 如何在Java代码中去掉烦人的“!=null”
  2. 关于jetbrains系列产品2018.1.5以后的使用(crack)方法
  3. 语音技术正在改变计算行业
  4. cpp cu入门教程
  5. 在SQL Server引用dll的流程
  6. 优先队列的数组实现(有序)
  7. mysql查询开启事务_MySQL中的查询事务问题
  8. 关系型数据库的隔离级别 读一致性
  9. python小玩意——计算器
  10. imx6ul linux4,iMX6UL 4秒快速启动-飞凌嵌入式iMX6UL启动加速
  11. 自抗扰控制(ADRC)—— 一阶系统
  12. oppo服务器在哪个文件夹,OPPO手机云服务备份的东西在哪里能找到
  13. 来自30岁女程序员的自我唤醒
  14. 如何更电计算机共享名称,手机电脑电视之间如何共享、投屏?
  15. 用网线实现两台电脑之间的文件共享
  16. 均值方差模型python_python实现资产配置(2)--Blacklitterman 模型
  17. 市场调研报告-全球与中国自动结账软件市场现状及未来发展趋势
  18. 超星浏览器4.0漏洞0day Exp
  19. 对话框窗口过程与普通窗口过程的区别
  20. 大一计算机重修不过怎么办,挂科了怎么办

热门文章

  1. 作为打工人,我在《我要投资》里看到了职场生存法则
  2. 笔记本电脑风扇嗡嗡声特别大的解决
  3. nmap mysql爆破_关于Nmap的简单爆破
  4. 长安大学计算机教程,教学情况-长安大学数字测图原理与方法精品资源共享课...
  5. 戴尔 Precision 5470 25 周年纪念款笔记本 评测
  6. 【变色龙】app封装系统源码+某站在售封装系统
  7. 《安全协议:理论与实践》(冯登国)读书笔记---一般存取结构上的秘密共享协议
  8. 手机端实现手机键盘搜索
  9. 【vant ui 双向输入框禁止手机键盘弹出】
  10. fonttype: Font T1 is of type Type3