2016-10-14 9 views
1

compress/gzipを使用してgzipファイルを読み込もうとしています。私は通常のtxtファイルまたはgzippedを取得するかどうかわからないので、私はhttp.DetectContentTypeを使用しています。私のコードは非常にまっすぐ進むと以下の通りである:golangで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でソースファイルをgzipしました。 私が間違っているところを教えてください。

答えて

2

ファイルの最初の512バイトを読み取っているので、gzip.Readerはこれを見ません。これらは通常のファイルであるため、あなたは成功したRead後に戻ってスタートに求めることができます:

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

だから、大きなバッファは、おそらく1024で十分でしょうか? – PiKaY

+0

ああ申し訳ありません。私はあなたの言うことを得る。試してみてください – PiKaY

+0

すごい。ありがとうございました。私はこれを考えなかった:) – PiKaY

関連する問題