archive/zip

步骤如下:

os.Createzip.NewWriter(file)

示例,批量下载网络图片,保存到zip文件中,包含目录。

func TestZip(t *testing.T) {
	file, err := os.Create("test.zip")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close()

	zipwriter := zip.NewWriter(file)
	defer zipwriter.Close()

	fs := []struct{
		Url, Name string
	}{
		{Url:"http://videoactivity.bookan.com.cn/photo_10_202011301057385583397829_t.jpg", Name:"/1/11/1.jpg"},
		{Url:"http://videoactivity.bookan.com.cn/photo_46_202011292229184376672977_t.jpg", Name:"2.jpg"},
		{Url:"http://videoactivity.bookan.com.cn/photo_46_202011292229229158424627_t.jpg", Name:"3.jpg"},
		{Url:"http://videoactivity.bookan.com.cn/photo_46_202011292215023830368256_t.jpg", Name:"4.jpg"},
		{Url:"http://videoactivity.bookan.com.cn/photo_46_202011291755419090055749_t.jpg", Name:"5.jpg"},
		{Url:"http://videoactivity.bookan.com.cn/photo_46_202011291755420502426479_t.jpg", Name:"6.jpg"},
	}

	for _, f := range fs {
		iowriter, err := zipwriter.Create(f.Name)
		if err != nil {
			if os.IsPermission(err) {
				fmt.Println("权限不足: ", err)
				return
			}
			fmt.Printf("Create file %s error: %s\n", f.Name, err.Error())
			return
		}

		var content []byte
		resp, err := http.Get(f.Url)
		if err == nil {
			content, err = ioutil.ReadAll(resp.Body)
			if err != nil {
				content = []byte("")
			}
			resp.Body.Close()
		}

		iowriter.Write(content)
	}

	// 创建空目录
	zipwriter.Create("/name/dir/")
}

几点说明:

zipwriter.Create("/1/11/1.jpg")(e.g. C:)/\/name/dir/