我正在尝试使用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中压缩了源文件。 请告诉我我哪里出错了。
答案 0 :(得分:2)
您正在读取文件的前512个字节,因此gzip.Reader
将无法看到。由于这些是常规文件,因此您可以在成功Read
:
f.Seek(0, os.SEEK_SET)