无效的GZIP标头

时间:2017-04-17 20:35:57

标签: http go gzip tar

我是Golang的新手,所以这可能非常明显,但我没有找到任何可用于Stackoverflow或Gzip文档的内容。

我通过Http下载.gz并将响应正文的内容写入文件中。但是,当我尝试从文件中读取它并解压缩时,我得到了#34;无效的标题"错误。

这是我的代码:

reader, err := os.Open(completeName)
if err != nil {
    panic(err)
}
defer reader.Close()

archive, err := gzip.NewReader(reader)
if err != nil {
    panic(err)
}
defer archive.Close()

target := destDirectory()
writer, err := os.Create(target + completeName)
if err != nil {
    panic(err)
}
defer writer.Close()

_, err = io.Copy(writer, archive)
return err

我虽然会收到我收到的内容无效但我试图通过" tar -xjf file.gz"解压缩它。它完美地运作。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你需要zlib而不是gzip:

func readGzip(content []byte) error {
    var buf *bytes.Buffer = bytes.NewBuffer(content)

    gRead, err := zlib.NewReader(buf)
    if err != nil {
        return err
    }

    if t, err := io.Copy(os.Stdout, gRead); err != nil {
        fmt.Println(t)
        return err
    }

    if err := gRead.Close(); err != nil {
        return err
    }
    return nil
}

答案 1 :(得分:0)

在服务器中:如果使用以下代码发送响应,响应正文将包含标头信息。这将导致无效的标头错误。

应使用ServeContent()函数发送文件。

streamPDFbytes, _ := os.Create("./data/Matt Aimonettirepo.go")
b := bytes.NewBuffer(streamPDFbytes)

// stream straight to client(browser)
w.Header().Set("Content-type", "application/octet-stream")
w.Header().Set("Content-Encoding", "gzip")

if _, err := b.WriteTo(w); err != nil { // <----- here!
    fmt.Fprintf(w, "%s", err)
}