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

时间:2016-10-14 13:19:02

标签: go gzip

我正在尝试使用compress / gzip读取gzip文件。我正在使用http.DetectContentType,因为我不知道我是否得到一个正常的txt文件或一个gzipped文件。我的代码非常简单,如下所示:

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

问题是gzip阅读器总是错误地说“无法读取gzip archive gzip:invalid header”我已经尝试了zlib库但是徒劳无功。我使用命令行gzip工具在mac中压缩了源文件。 请告诉我我哪里出错了。

1 个答案:

答案 0 :(得分:2)

您正在读取文件的前512个字节,因此gzip.Reader将无法看到。由于这些是常规文件,因此您可以在成功Read

之后回头查看
f.Seek(0, os.SEEK_SET)