【问题标题】:Invalid GZIP headerGZIP 标头无效
【发布时间】:2017-04-17 20:35:57
【问题描述】:

我是 Golang 的新手,所以也许这很明显,但我没有找到任何适用于 Stackoverflow 或 Gzip 文档的内容。

我通过 Http 下载一个 .gz 并将响应正文的内容写入一个文件。但是,当我尝试从文件中读取它并解压缩它时,我得到了“invalid header”错误。

这是我的代码:

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”解压缩它,它运行良好。

有什么想法吗?

【问题讨论】:

  • 如果 tar 和 -j 有效,它是一个 bzip 文件,而不是 gzip。

标签: http go gzip tar


【解决方案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
}

【讨论】:

  • 谢谢老哥,我明天试试:)
【解决方案2】:

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

应该使用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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 2012-08-21
    • 2019-05-13
    • 2015-11-05
    • 2017-03-27
    相关资源
    最近更新 更多