Golang实现文件断点续传
目录
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
,并为每个范围返回相应的内容。