Golang实现文件断点续传
目录
警告
本文最后更新于 2024-06-23,文中内容可能已过时。
Golang实现文件断点续传
HTTP 范围请求
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Range_requests
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Range
https://juejin.cn/post/7381455296658751551?searchId=202406222022394BE0D5BA1F1DB137CFF5
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/206

我们首先用golang写一个不具备范围请求的代码
|
|
上面的代码不仅明确声明禁用范围请求 (Accept-Ranges: none),还禁用 Range 请求(主动拒绝范围请求),这样我们不能在线看视频,因为视频是通过范围请求进行播放的


如果想看视频,那就需要取消对Range的限制,并取消禁用范围请求限制
但是因为没有实现断点续传部分功能,所以只是能范围请求了而已,断点续传还做不到


区别


断点续传
要实现断点续传,首当其冲的是要让服务器支持HTTP范围请求,而且不禁用客户端的Range请求

我们来了解一下Range请求头



我们用golang实现这个
|
|
当然,可以解析一下这个代码,以帮助你理解各部分的功能。
ChatGPT代码解析
导入包
|
|
这些包提供了处理 HTTP 请求、文件操作、字符串操作和日志记录所需的功能。
主函数
|
|
gin.Default():创建一个默认的 Gin 路由器。router.GET("/files/*filepath", fileHandler):注册一个处理 GET 请求的路由,当访问/files/*filepath时,会调用fileHandler处理。router.HEAD("/files/*filepath", fileHandler):注册一个处理 HEAD 请求的路由,当访问/files/*filepath时,也会调用fileHandler处理。- 启动服务器并监听端口
8080。
文件处理器函数
|
|
filePath := "." + c.Param("filepath"):获取请求的文件路径并在其前加上当前目录。os.Open(filePath):尝试打开文件,如果文件不存在或无法打开,返回 404 错误。defer file.Close():确保函数结束时关闭文件。
|
|
file.Stat():获取文件信息,如文件大小。如果无法获取文件信息,返回 500 错误。fileInfo.Size():获取文件大小。
|
|
c.GetHeader("Range"):获取请求头中的Range字段。如果没有Range头,返回整个文件。
|
|
strings.Split(rangeHeader, "="):解析Range头,确保其格式为bytes=...。如果格式不正确,返回 400 错误。
|
|
- 解析
Range头的各个部分,并将每个范围存储在rangesList列表中。 - 验证每个范围的起始和结束位置是否合法。如果不合法,返回相应的错误。
|
|
- 如果请求包含一个范围,设置
Content-Range和Content-Length响应头,并返回该范围内的文件内容。
|
|
- 如果请求包含多个范围,设置
Content-Type为multipart/byteranges,并为每个范围返回相应的内容。