展开目录
golang 解压zip文件
golangzipuncompress
X
陈尼玛的博客
记录开发生涯的踩坑经历,用时间来验证成长
加载中

golang的archive/zip包提供了解压zip文件的功能,但生产环境需要做一些校验以免服务被攻击。因此我封装了一个解压zip的方法,校验条件包含:最大解压文件/文件夹数,解压限时,解压出来文件大小之和,解压的根目录。

代码如下:

package main

import (
  "fmt"
  "time"
  "os"
  "io"
   "archive/zip"
   "path/filepath"
)

func main(){

  fmt.Println(Unzip("test.zip","./unzip/",60*2,500,1024*1024*10))

}
func Unzip(
  zipfile string, // zip文件路径
  outbasedir string, // 解压的根文件夹
  maxtime\_seconds int64, // 最多解压用时
  maxfiles int64, // 最大允许多少个文件
  maxSizeOfExtraFileAll uint64, // 解压之后的文件字节之和
) bool {
  e := os.MkdirAll(outbasedir, 0644)
  if e!=nil{return false}
  begin := time.Now().UnixNano()
  sizeOfAll := uint64(0)
  fi, e := zip.OpenReader(zipfile)
  if e!=nil {return false}
  defer fi.Close()
  for  _, v := range fi.File {
    maxfiles--
    if maxfiles<=0{return false}
    if (time.Now().UnixNano()-begin)/1e9 > maxtime_seconds{return false}
    info := v.FileInfo()
    fn,e := filepath.Abs(outbasedir+"/"+v.Name)
    sizeOfAll += v.UncompressedSize64
    if sizeOfAll>maxSizeOfExtraFileAll{return false}
    if e!=nil{continue}
    if info.IsDir() {
      e := os.MkdirAll(fn, 0644)
      if e!=nil{continue}
    }
    srcFile,e := v.Open()
    if e!=nil{continue}
    defer srcFile.Close()
    newFile,e := os.Create(fn)
    if e!=nil{continue}
    io.Copy(newFile, srcFile)
    newFile.Close()
  }
  return true
}

相关文档

暂无

随便看看

  1. git 大小写不区分问题

  2. react项目webpack打包时拆分异步加载的文件

  3. 安卓文字偏上,文字顶部被遮罩

  4. sass变量和继承类写法

  5. ipsec vpn 添加新账号

  6. raw.githubusercontent.com DNS被指向127.0.0.1

  7. css3 文字渐变色

  8. curl用法

  9. nodejs socks5

  10. 判断变量是否 0 或者 '0'

  11. nodejs俄罗斯方块

  12. npm设置仓库地址和代理

  13. 模拟307跳转情况

  14. ssl 证书生成方式

  15. python下载文件,带进度条控制

  16. sendmail用nginx做代理

  17. mysql选取内容导出到文件

  18. 随机取某个概率区间的代码

畅言模块加载中