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

Error on trying to read gzip files in golang

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

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 reader 总是出错 "Cannot read gzip archive gzip: invalid header" 我也尝试过 zlib 库,但没有成功。我使用命令行 gzip 工具将源文件 gzip 到 mac。 请告诉我哪里出错了。

您正在读取文件的前 512 个字节,因此 gzip.Reader 永远不会看到它。由于这些是常规文件,您可以在成功后返回开始 Read:

f.Seek(0, os.SEEK_SET)