`

golang http上传zip文件,自动解压到目录

 
阅读更多

 

 

 

App.go

 

package main

import (
	"./zip"
	"flag"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
)

var (
	dir  = flag.String("d", "./temp/", "location dir")
	addr = flag.String("b", "0.0.0.0:8090", "http listen port")
)

func main() {
	flag.Parse()
	log.Println("绑定" + *addr)
	log.Println("存储地址" + *dir)
	http.HandleFunc("/upload", upload)
	http.ListenAndServe(*addr, nil)

}

func upload(w http.ResponseWriter, r *http.Request) {

	if r.Method == "GET" {
		fmt.Fprintln(w, "滚")
		return
	}

	err := r.ParseMultipartForm(1024 * 1024 * 100)
	if err != nil {
		fmt.Fprintln(w, err)
		return
	}
	file, handler, err := r.FormFile("uploadfile")
	defer file.Close()
	if err != nil {
		fmt.Fprintln(w, err)
		return
	}

	os.Mkdir(*dir, 0777)

	log.Println(handler.Filename)

	f, err := os.OpenFile(*dir+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
	defer f.Close()
	if err != nil {
		fmt.Fprintln(w, err)
		return
	}

	io.Copy(f, file)

	err = ziputil.DeCompress(f.Name(), *dir)
	if err != nil {
		fmt.Fprintln(w, err)
		return
	}

	os.Remove(f.Name())

	fmt.Fprintln(w, "upload ok!")
}


 

 

  zip/ziputil.go

 

package ziputil

import (
	"archive/zip"
	"io/ioutil"
	"log"
	"os"
	"strings"
)

func DeCompress(tarFile, dest string) error {
	if strings.HasSuffix(tarFile, ".zip") {
		return zipDeCompress(tarFile, dest)
	}
	return nil
}

func zipDeCompress(zipFile, dest string) error {
	or, err := zip.OpenReader(zipFile);
	defer or.Close()
	if err != nil {
		return err
	}

	log.Print(" 压缩文件", zipFile, " 解压到", dest)

	for _, item := range or.File {
		if item.FileInfo().IsDir() {
			os.Mkdir(dest+item.Name, 0777);
			continue
		}
		rc, _ := item.Open()
		dst, _ := createFile(dest + item.Name);
		payload, err := ioutil.ReadAll(rc)
		n, err := dst.Write(payload)
		if err != nil {
			log.Print(dest + item.Name)
			log.Print(err)
		} else {
			log.Print(n/1024, "kb","  ",dest + item.Name)
		}
	}

	return nil
}

func createFile(name string) (*os.File, error) {
	err := os.MkdirAll(string([]rune(name)[0:strings.LastIndex(name, "/")]), 0755)
	if err != nil {
		return nil, err
	}
	return os.Create(name)
}

 

 

 

分享到:
评论

相关推荐

    毕业设计基于Golang开发的BBS论坛系统源码+项目使用说明.zip

    毕业设计基于Golang开发的BBS论坛系统源码+项目使用说明.zip 特性 注册/登陆模块(用户名或邮箱登陆) 设置昵称、邮箱、用户名 发表动态、文章 评论系统 动态/文章的点赞 支持浏览器 token 记住登录 支持文章...

    FastDFS_v5.05_安装包、工具包

    解压后,将jar包添加到项目的类路径中,按照API文档编写代码进行文件上传下载。 3. **libfastcommon**:libfastcommon-master.zip是FastDFS的公共库,包含了FastDFS所需的一些基础功能。解压后编译安装,为FastDFS...

    linux服务器命令

    使用`unzip`命令解压zip文件,如`unzip archive.zip`。 10. **启动Apache服务**: Apache服务器通常使用`systemctl`命令管理,启动Apache服务的命令为`sudo systemctl start httpd`(或者`apache2`,具体取决于...

    BaiduPCS-Go-v3.6-linux-amd64.zip

    1. **百度网盘**:百度网盘是一款由百度公司提供的云存储服务,用户可以在其中上传、下载文件,进行文件管理,并支持分享链接给其他用户。 2. **Go语言(Golang)**:Go语言是由Google开发的一种静态类型的、编译型...

    BaiduPCS-Go-v3.6.2-windows-x64.zip

    在压缩包内的文件名列表中,我们只看到了"BaiduPCS-Go-v3.6.2-windows-x64",这很可能是一个可执行文件或者安装包,用户解压后可以直接运行或安装到Windows系统中。通常,这样的程序会包含主程序、相关的配置文件、...

    crawlab-master.zip

    - **安装Crawlab**:首先下载 `crawlab-master.zip` 文件,解压后按照官方文档进行安装和配置,通常涉及安装依赖、运行服务等步骤。 - **配置环境**:确保你的环境中已经安装了支持的编程语言和相应的爬虫框架,例如...

    fueler:服务器接收源文件上传并将它们注入主 Node.js 应用程序

    它通过HTTP/HTTPS协议接收源文件,通常以压缩格式(如.zip或.tar.gz)发送,然后解压并整合到Node.js项目中。这一过程可能涉及权限检查、文件校验和防止重复上传的机制,以确保安全性和数据完整性。 4. **自动化...

    bosh-docker-cpi:BOSH 码头工人 cpi

    执行`bosh-init deploy manifest.yml`会启动BOSH的初始化过程,它将编译CPI代码,生成一个可以被BOSH使用的二进制文件,并将其上传到BOSH的Director。这个步骤是将CPI集成到BOSH系统的关键。 4. **手动联网**: 在...

Global site tag (gtag.js) - Google Analytics