以下是一个简单的Golang客户端代码示例,用于测试支持Range功能的服务器:
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
fileURL := "http://localhost:8080/download/example.txt" // 替换为您的文件URL
err := downloadFileWithRange(fileURL, "example.txt")
if err != nil {
fmt.Println("下载失败:", err)
} else {
fmt.Println("下载完成")
}
}
func downloadFileWithRange(url string, filename string) error {
resp, err := http.Get(url)
if err != nil {
return fmt.Errorf("请求下载文件时出错:%s", err.Error())
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusPartialContent {
return fmt.Errorf("服务器返回错误状态码:%d", resp.StatusCode)
}
file, err := os.Create(filename)
if err != nil {
return fmt.Errorf("创建本地文件时出错:%s", err.Error())
}
defer file.Close()
totalSizeStr := resp.Header.Get("Content-Length")
rangeBytesStr := resp.Header.Get("Content-Range")
if rangeBytesStr == "" {
io.Copy(file, resp.Body) // 下载整个文件
} else {
startByte, endByte, fileSize, err := parseContentRange(rangeBytesStr)
if err!=nil{
return fmt.Errorf("解析Content-Range时出错:%s",err.Error())
}
downloadedSize:=endByte-startByte+1
if totalSizeStr!=""{
totalSize,err:=strconv.ParseInt(totalSizeStr,10,64)
if err==nil && downloadedSize>=totalSize{
return nil // 已完全下载
}
}
io.CopyN(file, resp.Body, downloadedSize) // 下载部分文件
}
return nil
}
func parseContentRange(rangeStr string) (startByte int64, endByte int64, fileSize int64, err error) {
const unitPrefix = "bytes "
rangeStr = rangeStr[len(unitPrefix):]
rangeArr := strings.Split(rangeStr, "/")
if len(rangeArr) != 2 {
err = fmt.Errorf("无效的Content-Range格式")
return
}
byteRange := rangeArr[0]
fileSizeStr := rangeArr[1]
byteRangeArr := strings.Split(byteRange, "-")
if len(byteRangeArr) != 2 {
err = fmt.Errorf("无效的字节范围格式")
return
}
startByte, err = strconv.ParseInt(byteRangeArr[0], 10, 64)
if err != nil {
err = fmt.Errorf("无效的起始字节:%s", byteRangeArr[0])
return
}
endByte, err = strconv.ParseInt(byteRangeArr[1], 10, 64)
if err != nil {
err = fmt.Errorf("无效的结束字节:%s", byteRangeArr[1])
return
}
fileSize,err=strconv.ParseInt(fileSizeStr,10,64)
return startByte, endByte,fileSize,nil
}
您需要将代码中的fileURL
替换为您服务器上支持Range功能的文件URL,并指定本地保存的文件名。运行该代码,它将下载整个文件或部分文件(如果服务器支持范围请求)。
请注意,这只是一个简单的示例,并没有涵盖所有的异常处理和安全性考虑。在实际开发中,您可能需要添加更多的错误处理、超时控制和其他功能。
希望这个示例对您有所帮助!如果有任何问题,请随时提问。
内容由零声教学AI助手提供,问题来源于学员提问