dongtiao5094 2016-10-14 13:19
浏览 402
已采纳

尝试在Golang中读取gzip文件时出错

I am trying to read gzip files using compress/gzip. I am using http.DetectContentType as I do not know if I get a normal txt file or a gzipped one. My code is very straight forward and as below:

f, err := os.Open(fullpath)
if err != nil {
    log.Panicf("Can not open file %s: %v", fullpath, err)
    return ""
}
defer f.Close()

buff := make([]byte, 512)
_, err = f.Read(buff)
if err != nil && err != io.EOF{
    log.Panicf("Cannot read buffer %v", err);
    return ""
}

switch filetype := http.DetectContentType(buff); filetype {
case "application/x-gzip":
    log.Println("File Type is", filetype)
    reader, err := gzip.NewReader(f)
    if err != nil && err != io.EOF{
        log.Panicf("Cannot read gzip archive %v", err);
        return ""
    }
    defer reader.Close()
    target := "/xx/yy/abcd.txt"
    writer, err := os.Create(target)
    if err != nil {
        log.Panicf("Cannot write unarchived file %v", err);
        return ""
    }
    defer writer.Close()

    _, err = io.Copy(writer, reader)
    return target

The problem is that the gzip reader always errors out saying "Cannot read gzip archive gzip: invalid header" I have tried the zlib library too but in vain. I gzipped the source file in mac using the command line gzip tool. Please show me where I am going wrong.

  • 写回答

1条回答 默认 最新

  • doupiai5597 2016-10-14 13:24
    关注

    You're reading the first 512 bytes of the file, so the gzip.Reader won't ever see that. Since these are regular files, you can seek back to the start after a successful Read:

    f.Seek(0, os.SEEK_SET)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?