前提
Goでローカルディスクのファイルを読み込み、zip圧縮するプログラムを作っています。
一見同じように見える2パターンのコードで、片方だけがうまく動く動いており原因を知りたいです。
問題のあるコード
作成されたファイルは壊れており開けません。
go
1func (c *fileRepository) ZipFromCSVInfos(ctx context.Context, yyyymmdd string, csvInfos []*csv.Info) error { 2 buf := new(bytes.Buffer) 3 zipWriter := zip.NewWriter(buf) 4 defer zipWriter.Close() 5 6 for _, info := range csvInfos { 7 if err := c.addZipFile(zipWriter, info.Path); err != nil { 8 return err 9 } 10 } 11 12 file, _ := os.Create(fmt.Sprintf("./%s.zip", yyyymmdd)) 13 defer file.Close() 14 file.Write(buf.Bytes()) 15 16 return nil 17}
うまくいくソースコード
ファイルは解凍できます。
go
1func (c *fileRepository) ZipFromCSVInfos(ctx context.Context, yyyymmdd string, csvInfos []*csv.Info) error { 2 file, _ := os.Create(fmt.Sprintf("./%s.zip", yyyymmdd)) 3 defer file.Close() 4 zipWriter := zip.NewWriter(file) 5 defer zipWriter.Close() 6 7 for _, info := range csvInfos { 8 if err := c.addZipFile(zipWriter, info.Path); err != nil { 9 return err 10 } 11 } 12 13 return nil 14}
試したこと
上記の違いは、圧縮したデータを一度 bytes.Buffer に入れるか(前者)、直接Fileに出力するか(後者)のちがいです。
実現したいこと
最終的にはzip圧縮したデータをローカルディスクへファイル出力するのではなく、s3へアップロードしたいです。
そのためfileへwriteするのではなくbufferにwriteしたいと考えており、この問題を解決したいです。
補足情報(FW/ツールのバージョンなど)
go 1.18.1

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。