`

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大文件上传

    `golang大文件上传`这个主题涉及到了如何高效、安全地处理用户上传的大型文件。在本篇文章中,我们将深入探讨Golang实现大文件上传的关键知识点,并通过`upload.go`文件中的示例进行解析。 首先,Golang的标准库`...

    golang 文件夹压缩解压代码

    这段代码会打开ZIP文件,遍历每个条目,如果是文件则将其解压到目标目录,如果是目录则创建对应的目录结构。 注意,上述代码仅适用于ZIP格式的压缩。如果你需要处理其他格式(如GZ或TGZ),可能需要使用其他的库,...

    golang语言实现的文件上传与文件下载功能示例

    本文实例讲述了golang实现的文件上传与文件下载功能。分享给大家供大家参考,具体如下: upload.go 复制代码 代码如下:package common import (  “io/ioutil”  “os”  “path”  “github.com/gin-gonic/gin...

    Golang资源.zip

    Golang资源.zip

    基于Golang和Vue的文件管理系统源码.zip

    这是一个基于Golang后端和Vue.js前端开发的文件管理系统的源码包。下面将详细介绍这个系统的核心技术和实现原理。 **Golang(Go语言)** Golang是Google开发的一种静态类型、编译型、并发型、垃圾回收的编程语言。...

    golang安装教程和安装包.zip

    将解压后的Goland二进制文件移动到一个可执行目录,比如`/usr/local/bin`: ``` sudo mv goland-2018.1.6/bin/goland /usr/local/bin ``` 3. **创建启动器快捷方式**: 创建一个桌面快捷方式,以便于启动...

    golang_http_client

    golang_http_client

    golang提取office文件内容

    golang提取office文件内容,可以支持正常office文件内容格式,可以很好的提取标点以及内在格式内容

    implant:用于在golang二进制文件中嵌入文件资源的简单实用程序

    预期的用例是您有一个HTTP服务器或类似的golang应用程序,希望将其作为单个二进制文件分发,但需要一些模板文件,HTML文件或其他媒体。 与其将二进制文件与文件集合一起分发,不如将文件内容嵌入应用程序中,并在...

    golang开发编译后文件

    在Golang(Go语言)开发过程中,编译后生成的文件是程序的可执行形式,它们使得源代码能够在目标平台上运行。本篇文章将详细介绍Golang开发中的编译过程以及相关工具,包括`div`, `gocode`, `gopkgs`, `impl`, `...

    开源项目-golang-go.zip

    用户在解压后,可以浏览这些文件来获取关于如何筹备和执行Go 1.6版本发布派对的具体信息。 在Go 1.6版本中,可能包含了一些重要的更新和改进,例如性能优化、新的库函数、更好的错误处理机制或是改进的工具链。...

    VSCode-golang-linux.zip

    4. **安装与配置**:解压"VSCode-golang-linux.zip"后,首先需要确保已安装VSCode,并将插件文件复制到`$GOPATH/bin`目录。然后在VSCode中,用户需要配置`GOPATH`和`GOBIN`环境变量,确保VSCode能正确识别Go的路径。...

    Golang实现的HTTP客户端下载限速功能包.rar

    最近在学习Golang语言,中间遇到一个前辈指点,有一个学习原则:Learning By Doing。跟我之前学习Java的经验高度契合。在前一段时间学习洼坑中挣扎了好几天,差点就忘记这个重要的成功经验。 那么那什么来做练习呢...

    golang写的文件批量删除工具delete_tool.exe

    delete_tool.exe是一个可执行文件,它利用了Golang强大的文件操作能力,能够快速遍历指定目录,对其中的文件进行批量删除操作。这个工具的出现,极大地简化了用户手动删除大量文件的繁琐过程,提升了工作效率。 ...

    循环鼠标自动点击功能- Golang实现

    Golang,作为一种现代且高效的编程语言,因其强大的系统级编程能力和并发特性而受到广泛欢迎。在本文中,我们将深入探讨如何利用Golang实现这个功能,并了解相关的核心知识点。 首先,我们需要了解的是Golang的图形...

    Golang_GoHTTP 403绕过工具.zip

    本篇文章将深入探讨Golang中如何利用GoHTTP库来处理403错误,并介绍403jump_main.zip可能包含的内容。 GoHTTP是Golang语言中用于HTTP请求的一个库,它提供了更灵活和强大的功能,相比标准库"net/http",GoHTTP允许...

    golang实现ftp上传资源

    4. **FTP命令**:FTP命令包括`USER`、`PASS`用于登录,`CWD`改变当前工作目录,`MKD`创建新目录,`STOR`用于上传文件。在Go程序中,需要正确构造这些命令的字符串,并通过TCP连接发送。 5. **并发处理**:Go语言的...

    树莓派LCD1602 i2c驱动golang版.zip

    标题中的“树莓派LCD1602 i2c驱动golang版”指的是在树莓派上使用Golang语言编写的I2C驱动程序,用于控制LCD1602显示器。LCD1602是一种常见的字符型液晶显示模块,通常用于嵌入式系统中显示文本信息,具有16个字符...

Global site tag (gtag.js) - Google Analytics