无效的GZIP头部

huangapple go评论167阅读模式
英文:

Invalid GZIP header

问题

我是新手使用Golang,所以这可能是一些很明显的东西,但我在Stackoverflow或Gzip文档中没有找到任何有效的解决方法。

我通过Http下载了一个.gz文件,并将响应体的内容写入文件。然而,当我尝试从文件中读取并解压缩时,出现了"invalid header"错误。

以下是我的代码:

  1. reader, err := os.Open(completeName)
  2. if err != nil {
  3. panic(err)
  4. }
  5. defer reader.Close()
  6. archive, err := gzip.NewReader(reader)
  7. if err != nil {
  8. panic(err)
  9. }
  10. defer archive.Close()
  11. target := destDirectory()
  12. writer, err := os.Create(target + completeName)
  13. if err != nil {
  14. panic(err)
  15. }
  16. defer writer.Close()
  17. _, err = io.Copy(writer, archive)
  18. return err

我认为可能是我接收到的内容无效,但我尝试通过"tar -xjf file.gz"解压缩它,结果完全正常。

有什么想法吗?

英文:

I am new to Golang, so maybe this is something quite evident but I did not find anything that is working on Stackoverflow or on the Gzip documentation.

I download a .gz through Http and write the content of the response body in a file. However, when I try to read it from the file and uncompress it, I got the "invalid header" error.

Here is my code :

  1. reader, err := os.Open(completeName)
  2. if err != nil {
  3. panic(err)
  4. }
  5. defer reader.Close()
  6. archive, err := gzip.NewReader(reader)
  7. if err != nil {
  8. panic(err)
  9. }
  10. defer archive.Close()
  11. target := destDirectory()
  12. writer, err := os.Create(target + completeName)
  13. if err != nil {
  14. panic(err)
  15. }
  16. defer writer.Close()
  17. _, err = io.Copy(writer, archive)
  18. return err

I though it would be that the content I receive is invalid but I tried to uncompress it via "tar -xjf file.gz" and it worked perfecly.

Any ideas ?

答案1

得分: 4

你需要使用zlib而不是gzip:

  1. func readGzip(content []byte) error {
  2. var buf *bytes.Buffer = bytes.NewBuffer(content)
  3. gRead, err := zlib.NewReader(buf)
  4. if err != nil {
  5. return err
  6. }
  7. if t, err := io.Copy(os.Stdout, gRead); err != nil {
  8. fmt.Println(t)
  9. return err
  10. }
  11. if err := gRead.Close(); err != nil {
  12. return err
  13. }
  14. return nil
  15. }

这段代码使用zlib库来读取gzip压缩的内容。

英文:

you need zlib rather than gzip:

  1. func readGzip(content []byte) error {
  2. var buf *bytes.Buffer = bytes.NewBuffer(content)
  3. gRead, err := zlib.NewReader(buf)
  4. if err != nil {
  5. return err
  6. }
  7. if t, err := io.Copy(os.Stdout, gRead); err != nil {
  8. fmt.Println(t)
  9. return err
  10. }
  11. if err := gRead.Close(); err != nil {
  12. return err
  13. }
  14. return nil
  15. }

答案2

得分: -1

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

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

  1. streamPDFbytes, _ := os.Create("./data/Matt Aimonettirepo.go")
  2. b := bytes.NewBuffer(streamPDFbytes)
  3. // 直接流式传输到客户端(浏览器)
  4. w.Header().Set("Content-type", "application/octet-stream")
  5. w.Header().Set("Content-Encoding", "gzip")
  6. if _, err := b.WriteTo(w); err != nil { // <----- 这里!
  7. fmt.Fprintf(w, "%s", err)
  8. }
英文:

In the Server: if use below code sends response, the response body will include header information. It will lead to invalid header error.

Should use ServeContent() function to send file.

  1. streamPDFbytes, _ := os.Create(&quot;./data/Matt Aimonettirepo.go&quot;)
  2. b := bytes.NewBuffer(streamPDFbytes)
  3. // stream straight to client(browser)
  4. w.Header().Set(&quot;Content-type&quot;, &quot;application/octet-stream&quot;)
  5. w.Header().Set(&quot;Content-Encoding&quot;, &quot;gzip&quot;)
  6. if _, err := b.WriteTo(w); err != nil { // &lt;----- here!
  7. fmt.Fprintf(w, &quot;%s&quot;, err)
  8. }

huangapple
  • 本文由 发表于 2017年4月18日 04:35:57
  • 转载请务必保留本文链接:https://go.coder-hub.com/43459174.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定