黑色幽默595 2023-04-29 18:34 采纳率: 85.7%
浏览 15
已结题

go zip打包目录,需要打包指定目录。同时gin下载

疑问1:使用zip的时候 压缩文件时绝对路径,所有的目录层级都出来了。我是哪里写错了吗?

img


打包目标目录

代码执行结果

img

直接从 电脑梗目录开始生成文件夹
是代码哪里写错了吗

疑问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
}
  • 写回答

1条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 5月11日
  • 已采纳回答 5月3日
  • 创建了问题 4月29日

悬赏问题

  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题
  • ¥15 用ADS设计一款的射频功率放大器
  • ¥15 怎么求交点连线的理论解?