Goでzipファイルを作る
最終更新日:2023-05-01
    
    標準の archive/zip
 パッケージを使うとGoでzipファイルが作れます。
保存先を作る
まず保存先となるファイルを作ります。
file, err := os.Create("test.zip")
if err != nil {
	panic(err)
}
defer file.Close()
zip.Writerを作る
zip.NewWriter()
で作ります。 io.Writer
 があればいいので、Web APIの場合は http.ResponseWriter
 を渡せばよいです。
w := zip.NewWriter(file)
defer w.Close()
ファイルを追加する
Create()
 でzipに含めるファイルを追加します。フォルダにいれる場合は次のように /
 で区切っておきます。
entry1, err := w.Create("test/test1.txt")
if err != nil {
	panic(err)
}
entry1.Write([]byte("test1 file"))
entry1
 は単なる io.Writer
 なのでそのまま Write()
 したり、 io.Copy()
 で書き込んだりすればOKです。
ヘッダ付きファイルを追加する
Create()
 で追加したファイルにはヘッダ情報がないのでファイル作成日が 00-00-1980
 になったりします。  CreateHeader()
 を使うとヘッダ情報付きでファイルを追加できます。
entry2, err := w.CreateHeader(&zip.FileHeader{
	Name:     "test/test2.txt",
	Method:   zip.Deflate,
	Modified: time.Now(),
})
if err != nil {
	panic(err)
}
entry2.Write([]byte("test2 file"))
全体
こんな感じになります
package main
import (
	"archive/zip"
	"fmt"
	"os"
	"time"
)
func main() {
	file, err := os.Create("test.zip")
	if err != nil {
		panic(err)
	}
	defer file.Close()
	w := zip.NewWriter(file)
	defer w.Close()
	entry1, err := w.Create("test/test1.txt")
	if err != nil {
		panic(err)
	}
	entry1.Write([]byte("test1 file"))
	entry2, err := w.CreateHeader(&zip.FileHeader{
		Name:     "test/test2.txt",
		Method:   zip.Deflate,
		Modified: time.Now(),
	})
	if err != nil {
		panic(err)
	}
	entry2.Write([]byte("test2 file"))
	fmt.Printf("Done!\n")
}
    
