这里只展示了核心代码部分,使用了封装request和response的gin框架,若小伙伴没使用可用改成go自带的http。

func SendFile(r *gin.Context) {//断点续传标志var range_ext = r.GetHeader("Range")filePath := "." + r.Request.URL.Pathif filePath == "./" {filePath = "./index.html"}parts := strings.Split(filePath, ".")print(parts[len(parts)-1] + "\n")print(filePath + "\n")file1, _ := os.Open(filePath)data, _ := ioutil.ReadAll(file1)//获取content typecontentType := extensionToContentType[parts[len(parts)-1]]print(contentType + "\n")if file1 == nil {r.HTML(404, "404.html", gin.H{})return}var FileStreamSize int64 = r.Request.ContentLengthif FileStreamSize == 0 {fi, _ := file1.Stat()FileStreamSize = fi.Size()}var FileStreamLen string = strconv.FormatInt(FileStreamSize, 10)//Range字段为空, 直接发送数据if range_ext == "" {r.Writer.Header().Set("Content-Type", contentType)r.Writer.Header().Set("Content-Length", FileStreamLen)r.Writer.WriteHeader(200)r.Writer.Write(data)return}//Range字段非空,断点续传模式fmt.Printf("part  download...\n")fmt.Printf("head range is:%s\n", range_ext)length := strings.Index(range_ext, "=")allRange := range_ext[length+1:]remove := strings.Index(allRange, "-")prelen := allRange[:remove]behind := allRange[remove+1:]var start int64var end int64if prelen == "" {behindint, _ := strconv.ParseInt(behind, 10, 64)start = FileStreamSize - behindintend = FileStreamSizeFileStreamLen = behind}if behind == "" {prelenint, _ := strconv.ParseInt(prelen, 10, 64)start = prelenintend = FileStreamSizeFileStreamLen = strconv.FormatInt(end-start, 10)}if prelen != "" && behind != "" {prelenint, _ := strconv.ParseInt(prelen, 10, 64)behindint, _ := strconv.ParseInt(behind, 10, 64)start = prelenintend = behindintFileStreamLen = strconv.FormatInt(end-start+1, 10)}allRange = allRange + strconv.FormatInt(FileStreamSize, 10)fmt.Printf("start:%v, end:%v, allRange:%v, FileSize:%v, FileLen:%v\n", start, end, allRange, FileStreamSize, FileStreamLen)r.Writer.Header().Set("Content-Type", contentType)r.Writer.Header().Set("Accept-Ranges", "bytes")r.Writer.Header().Set("Content-Length", FileStreamLen)r.Writer.Header().Set("Content-Range", "bytes "+allRange+"/"+strconv.FormatInt(FileStreamSize, 10))r.Writer.WriteHeader(206)r.Writer.Write(data[start:end])fmt.Println("file Wirte finished")
}

golang实现断点续传相关推荐

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

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

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

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

  3. Golang断点续传

    目录 前言 一.Seek介绍 二.Seek的使用 1.SeekStart 2.SeekCurrent 3.SeekEnd 三.断点续传 前言 对于一些较大文件的上传下载,我们期望的是能够一次就完成,这 ...

  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. 响应因特网端口ping命令_如何使用Ping命令识别基本的Internet问题
  2. 计算机无法安装系统,为什么计算机无法重新安装系统?
  3. 富交互Web应用中的撤销和前进
  4. html2canvas导出地图,Leaflet OpenStreetMap使用html2canvas使用地图标记导出图像
  5. 创建新的option
  6. bzoj1269 文本编辑器 splay
  7. mngoDB 常用语法
  8. 最优化知识笔记整理汇总
  9. 深圳端午节骑行活动,欢迎大家参加
  10. 神舟Z8-SP7D1驱动安装
  11. ECharts 示例——双Y轴
  12. 业务与系统的傲慢与偏见
  13. opc是什么? opc ua是什么?
  14. 游戏测评浅浅试—MMO手游太古神王2测评
  15. NAACL'22 Findings | 社交媒体上的抱怨强度分析
  16. 2021东京奥运会在哪看直播?当贝投影F3看直播效果好么?
  17. 文摘: 《变革中的思索》:重读《孙子兵法》
  18. oracle ebs 组件,Oracle EBS 中BOM学习
  19. 再见SpringMVC!字节跳动正式启动2021届秋季校招!不可思议!
  20. 基于深度学习和指代消解的中文人名识别

热门文章

  1. dc元数据和html描述资源,在HTML中使用DC元数据
  2. 华为AP固件升级方法 (适用 4051TN系列AP)
  3. 如何用Python计算特征重要性?
  4. 深度思考:变好,是对看不起你的人最有力的还击
  5. arduino烧写报错:can‘t open device “\\.\COM1“
  6. MapReduceJob提:交流程之JobClient端分析
  7. 关于Google智能眼镜的设计
  8. AUTOSAR实战教程 - 通信协议栈CAN_CANIF_PDUR_CANTP_COM_XCP_ECUC配置一网打尽
  9. android mp4v2,MP4v2视频库漏洞分析
  10. JAVA扫雷小游戏(待改进)