golang基础包 archive/zip
提供了操作zip的能力。
步骤如下:
- 使用
os.Create
创建一个空的文件 file,如果存在则会被清空。 - 使用
zip.NewWriter(file)
得到 *zip.Writer,使用它即可操作zip文件。
示例,批量下载网络图片,保存到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")
添加一个文件到zip file中,如果包含目录,则目录也会被自动创建。文件路径必须是相对路径,不能以盘符(e.g. C:)
开头,而且分隔符要使用斜线(/
)而不能使用反斜线(\
),如果只想创建目录而不是文件,可以使用斜线结尾(/name/dir/
)。此 Create 方法返回 Writer ,通过这个 Writer 可以将内容写入文件。- 文件的内容必须在下一次调用 CreateHeader、Create 或 Close 方法之前全部写入。