2016-10-14 3 views
1

Я пытаюсь читать gzip-файлы с помощью compress/gzip. Я использую http.DetectContentType, поскольку я не знаю, получаю ли я обычный файл txt или gzipped. Мой код очень прямо вперед, и, как показано ниже:Ошибка при попытке прочитать gzip-файлы в golang

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 тоже, но тщетно. Я загрузил исходный файл в mac с помощью командной строки gzip. Пожалуйста, покажите мне, где я ошибаюсь.

ответ

2

Вы читаете первые 512 байт файла, поэтому gzip.Reader этого никогда не увидит. Поскольку это обычные файлы, вы можете обратиться назад к началу после успешного Read:

f.Seek(0, os.SEEK_SET) 
+0

Так бы больший буфер, возможно, 1024 хватает? – PiKaY

+0

О, извините. Я понимаю, что ты говоришь. Ill попробуйте, что – PiKaY

+0

Amazing. Спасибо. Я не думал об этом :) :) – PiKaY