美文网首页
golang http range头,部分请求资源

golang http range头,部分请求资源

作者: 哆啦在这A梦在哪 | 来源:发表于2023-02-13 14:40 被阅读0次

直接上代码

package main

import (
    "errors"
    "io"
    "log"
    "net/http"
    "os"
    "strconv"
    "time"
)

func main() {
    i := 0
    fileURL := "http://127.0.0.1:8080/assets/aa.jpeg" // 你的资源地址
    fileLen, err := getFileLength(fileURL)// 获取一下资源大小
    if err != nil {
        log.Println(err)
        return
    }
    log.Println("filelen:", fileLen)
    f, err := os.OpenFile("aa", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        log.Println(err)
        return
    }
    defer f.Close()

    for {
        da, err := get(i, fileLen, fileURL)
        if err != nil || len(da) == 0 {
            log.Println(err)
            return
        }
        if _, err := f.Write(da); err != nil {
            log.Println(err)
            return
        }
        i += 20000
        time.Sleep(time.Second)
    }

}

func get(flag int, fileLen int64, fileURL string) ([]byte, error) {
    client := &http.Client{}
    req, err := http.NewRequest("GET", fileURL, nil)
    if err != nil {
        return nil, err
    }
    // Range 的内容参数就只有一个 bytes
    // 中间用减号隔开,不写头或者尾,代表从头或到结尾,比如:bytes= -200,就是从头到两百
    // 可以支持多个,用逗号隔开,比如 bytes=0-200,600-900
    // 注意区间两边都能获取到
    rangeBytes := ""
    switch {
    case int64(flag)+20000 >= fileLen:
        // 注意这一步,如果超过范围,会导致当前这次失败
        // 比如我这里每次取 20000,但是最后剩下 200,这次就反馈 416,不会反馈剩余的这 200 数据,就会丢数据
        rangeBytes = "bytes=" + strconv.Itoa(flag+1) + "-"
    case flag == 0:
        rangeBytes = "bytes=" + strconv.Itoa(flag) + "-" + strconv.Itoa(flag+20000)
    default:
        rangeBytes = "bytes=" + strconv.Itoa(flag+1) + "-" + strconv.Itoa(flag+20000)
    }
    log.Println("rangeBytes:", rangeBytes)
    req.Header.Add("Range", rangeBytes)
    resp, err := client.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    da, err := io.ReadAll(resp.Body)
    if err != nil {
        return nil, err
    }
    log.Println("code:", resp.StatusCode, "flag:", flag, "/:", fileLen)
    if resp.StatusCode != 206 {
        log.Println("stop:", string(da))
        return nil, errors.New(string(da))
    }
    return da, nil
}

func getFileLength(url string) (int64, error) {
    req, err := http.Head(url)
    return req.ContentLength, err
}

相关文章

  • golang http range头,部分请求资源

    直接上代码

  • Http请求头Range

    用于请求服务器返回指定部分内容,常用由于断点续传。 请求格式 Range: <数据格式>=<数据开始的索引位置>-...

  • iOS 网络篇请求方法(GET & POST)

    1.网络知识 URL:是网络资源的唯一标识 HTTP请求包含三部分:请求行、请求头、请求体 HTTP服务器与应用服...

  • 断点下载

    断点下载重点 利用HTTP请求头的Range属性,就可以实现从指定位置开始下载表示头500个字节:Range: b...

  • HTTP报文

    HTTP请求报文 1.组成部分 HTTP请求报文有3部分组成,请求头+请求行+请求体。 请求方法。HTTP的请求方...

  • 002-HTTP request对象

    HTTP request对象 HTTP 协议版本号 请求的服务器资源 请求的方式 请求的头信息

  • HTTP基础知识整理

    1. HTTP请求报文格式 HTTP请求报文分为三部分:请求行、请求头和请求体 注:部分文章也将HTTP请求报文分...

  • HTTP request对象

    HTTP 协议版本号 请求的服务器资源 请求的方式 请求的头信息

  • http请求响应及curl

    1、HTTP请求包括以下几个部分: 请求行(例如GET / HTTP/1.1)请求头(例如Accept-Langu...

  • Android 多线程下载和断点续传

    需要知识 1. Http请求头 Range 读取网络下载文件的指定范围的字节 2. RandomAccessFil...

网友评论

      本文标题:golang http range头,部分请求资源

      本文链接:https://www.haomeiwen.com/subject/wuvjkdtx.html