问题描述

最近做广告业务获取某推的广告成效,与其他渠道不同的是,最终拿到的成效数据是一个压缩包的HTTP流数据。

将数据写入到本地生成了一个以.gz为后缀的压缩包文件,解压以后的文件存放着json格式的成效数据。

当然需要程序去解压缩这个压缩包获取里面的文件了。

内置tar包的问题

参考网上大佬们之前的解决方案写了一段测试代码:

// TODO:解压gz文件
func decompressionGZ(fileName string) error {
    filePath := GZIPS_PATH + fileName
    // file read
    fr, err := os.Open(filePath)
    if err != nil {
        return err
    }
    fmt.Println("fr>>> ", fr)
    defer fr.Close()
    // gzip read
    // TODO:这一步会校验文件的Header
    gr, err := gzip.NewReader(fr)

    fmt.Println("gr_before>>> ", gr)

    //createTime := time.Date(2020, 01, 01, 00, 00, 00, 00, TIME_LOCATION_CST)
    //gr.Header.Comment = "xxx"
    //gr.Header.Name = "whw"
    //gr.Header.ModTime = createTime
    
    //fmt.Println("gr.after>>>>> ", gr)

    fmt.Println("gr.Header>>>>> ", gr.Header)
    fmt.Println("gr.err>>>>>> ", err)
    if err != nil {
        return err
    }
    defer gr.Close()
    // tar read
    tr := tar.NewReader(gr)
    //fmt.Println("tr>>> ", tr)
    // 读取文件
    for {
        h, err := tr.Next()
        fmt.Println("h_err>>>>>> ", err)
        fmt.Println("h>>> ", h)
        if err == io.EOF {
            break
        }
        if err != nil {
            fmt.Println("err0>>> ", err)
            return err
        }
        // 打开文件
        fw, err := os.OpenFile("xxx.json", os.O_CREATE|os.O_WRONLY, os.ModePerm)
        if err != nil {
            fmt.Println("err1...... ", err)
            return err
        }
        defer fw.Close()
        // 写文件
        _, err = io.Copy(fw, tr)
        if err != nil {
            fmt.Println("err2>>> ", err)
            return err
        }
    }
    return nil
}
使用原生golang包tar解压的函数