疑问1:使用zip的时候 压缩文件时绝对路径,所有的目录层级都出来了。我是哪里写错了吗?
打包目标目录
代码执行结果
直接从 电脑梗目录开始生成文件夹
是代码哪里写错了吗
疑问2: zip 文件在调用我自写的 compress 方法后,在如何写入 c.writer() 不知道用什么方法转换
主要是我不知道,文件流之间的各种转换方法,要是有好文章,推荐十分感谢
疑问3: 代码中大量的err 是否有更加优雅的 方式去编写了,目前写出来的额东西 自己看的都有点恶心
完整代码 git
https://github.com/LFweixiao/go-my-start
/ DownloadZip 下载Zip文件
// 下载指定路径文件,并且会在本地生产 zip包
// TODO ZIP文件怎么通过gin 传回前端
// TODO zip的目录层级不对
func (f *FileServer) DownloadZip(c *gin.Context) error {
// 这里用的绝对路径 读取到本地文件到流
var packPath = global.PRO_CONFIG.System.ProjectPath + DIR_PATH
dirs, err := ioutil.ReadDir(packPath)
if err != nil {
return err
}
fileName := "打包文件"
// 创建zip 打包文件
localZip, err := os.Create(packPath + fileName + ".zip")
if err != nil {
return err
}
// 可操作的流
zipWriter := zip.NewWriter(localZip)
defer zipWriter.Close()
// 读取目录中的文件打包
for _, file := range dirs {
compress(file, packPath, zipWriter)
}
// 设置响应头
c.Header("Content-Dispostition", "attachment;filename="+fileName+".zip") // 文件名
c.Header("Content-Type", "application/zip") // 文件传输类型 .zip
//c.Writer.Write()
return nil
}
// compres 根据文件 是dir 还是文件来 判断压缩
// file 传入文件
// dirPath 当前目录路径
// zzip zip读流
func compress(file os.FileInfo, dirPath string, zzip *zip.Writer) error {
// 当前文件是目录时
if file.IsDir() {
// 拼接目录
dirPathtwo := dirPath + file.Name() + "/"
dir, err := ioutil.ReadDir(dirPathtwo)
if err != nil {
return err
}
// 读取目录下的文件
for _, fi := range dir {
f, err := os.Open(dirPathtwo + fi.Name())
if err != nil {
return err
}
defer f.Close()
info, err := f.Stat()
if err != nil {
return err
}
err = compress(info, dirPathtwo, zzip)
if err != nil {
return err
}
}
} else {
// 创建一个文 头部
header, err := zip.FileInfoHeader(file)
if err != nil {
return err
}
header.Name = dirPath + header.Name
writer, err := zzip.CreateHeader(header)
if err != nil {
return err
}
f, err := os.Open(header.Name)
if err != nil {
return err
}
_, err = io.Copy(writer, f)
defer f.Close()
if err != nil {
return err
}
}
return nil
}