【问题标题】:Error on trying to read gzip files in golang尝试在 golang 中读取 gzip 文件时出错
【发布时间】:2016-10-14 13:19:02
【问题描述】:

我正在尝试使用 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 阅读器总是出错说“无法读取 gzip 存档 gzip:无效标头” 我也尝试过 zlib 库,但徒劳无功。我使用命令行 gzip 工具在 mac 中压缩了源文件。 请告诉我哪里出错了。

【问题讨论】:

    标签: go gzip


    【解决方案1】:

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

    f.Seek(0, os.SEEK_SET)
    

    【讨论】:

    • 那么更大的缓冲区,也许 1024 就足够了吗?
    • 哦,对不起。我明白你所说的。我试试看
    • 太棒了。谢谢你。我没有想到这个:) :)
    猜你喜欢
    • 2016-06-29
    • 2013-04-15
    • 1970-01-01
    • 2021-03-15
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2018-11-08
    相关资源
    最近更新 更多