镜缘浮影 小人本住在 苏州的城外 家里有屋又有田 生活乐无边

Gin 9

2018-07-09
wilmosfang
go
 
原文地址 http://soft.dog/2018/07/09/go-gin-09/

前言

Gin 是一款用 Go(Golang) 编写的 web 框架

Gin is a web framework written in Go (Golang). It features a martini-like API with much better performance, up to 40 times faster thanks to httprouter

因为 httprouter, 它提供了更高的性能

这里演示一下 Gin 如何上传多个文件

gin 的 API 可以参考 API REFFERENCE

Tip: 当前的版本为 Gin 1.2Go 1.10 (但是实验环境下,Go没有使用最新的版本)


操作

系统环境

[root@h160 ~]# hostnamectl 
   Static hostname: h160
         Icon name: computer-vm
           Chassis: vm
        Machine ID: d46f9440d4be429ea66b726977adf233
           Boot ID: a0fc6a1b4f124e39a27866d4df0701fa
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-862.2.3.el7.x86_64
      Architecture: x86-64
[root@h160 ~]# ip a 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:c9:c7:04 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
       valid_lft 84363sec preferred_lft 84363sec
    inet6 fe80::5054:ff:fec9:c704/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:48:f4:2c brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.160/24 brd 192.168.56.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe48:f42c/64 scope link 
       valid_lft forever preferred_lft forever
[root@h160 ~]# go version
go version go1.9.4 linux/amd64
[root@h160 ~]#

进入 GOPATH

[vagrant@h160 ~]$ echo $GOPATH
/vagrant/go
[vagrant@h160 ~]$ cd $GOPATH
[vagrant@h160 go]$ pwd
/vagrant/go
[vagrant@h160 go]$ 

代码注解

package main //指明此包为 main 包

import ( //使用这种方式导入多个包可以更为简洁
	"fmt"      //导入 fmt,可以进行格式化输出
	"log"      //使用 log 包来进行日志生成
	"net/http" // 导入 net/http 可以使用其中的 http.StatusOK

	"github.com/gin-gonic/gin" //导入 gin 包
)

func main() {
	r := gin.Default()                       // 使用 gin.Default() 方法生成一个引擎实例,这个实例默认情况下已经将 Logger Recovery 进行了装载
	r.MaxMultipartMemory = 8 << 20           // 8 MiB
	r.POST("/upload", func(c *gin.Context) { //使用 POST 方法 func (group *RouterGroup) POST(relativePath string, handlers ...HandlerFunc) IRoutes ,POST 是 router.Handle("POST", path, handle) 的快捷方式
		form, _ := c.MultipartForm()   //获取表单的信息  func (c *Context) MultipartForm() (*multipart.Form, error)
		files := form.File["upload[]"] //获取文件列表
		index := 1                     //创建索引,从1开始标记
		for _, file := range files {   //进行文件列表的遍历
			log.Println(file.Filename)              //将文件名进行打印
			dst := fmt.Sprintf("/tmp/tmp%d", index) //拼接目标文件的路径
			log.Println(dst)                        //将目标位置打印出来
			c.SaveUploadedFile(file, dst)           //将上传的文件以指定的文件名进行本地保存
			index++                                 //将索引增一
		}
		c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) //将文件的个数计算出来,进行答应,并且反馈给客户
	})
	r.Run(":8080") //在 0.0.0.0:8080 上启监听
}

编译执行

[root@h160 go]# go run hello.go 
[GIN-debug] [WARNING] Now Gin requires Go 1.6 or later and Go 1.7 will be required soon.

[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:	export GIN_MODE=release
 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] POST   /upload                   --> main.main.func1 (3 handlers)
[GIN-debug] Listening and serving HTTP on :8080
abc1
/tmp/tmp1
abc2
/tmp/tmp2
abc3
/tmp/tmp3
abc4
/tmp/tmp4
[GIN] 2018/07/09 - 16:18:29 | 200 |   44.142597ms |  192.168.56.105 | POST     /upload
...
...
...

客户的请求为

[vagrant@h105 ~]$ echo 1 > abc1
[vagrant@h105 ~]$ echo 2 > abc2
[vagrant@h105 ~]$ echo 3 > abc3
[vagrant@h105 ~]$ echo 4 > abc4
[vagrant@h105 ~]$ cat abc*
1
2
3
4
[vagrant@h105 ~]$
[vagrant@h105 ~]$ curl  -X POST http://192.168.56.160:8080/upload -F "upload[]=@./abc1" -F "upload[]=@./abc2" -F "upload[]=@./abc3"   -F "upload[]=@./abc4"  -H "Content-Type: multipart/form-data"
4 files uploaded![vagrant@h105 ~]$ 
[vagrant@h105 ~]$ 

结果同时输出到了客户端和console

服务端的目标路径里也多了一批内容相同的文件,并且创建时间也是吻合的

[vagrant@h160 ~]$ ll /tmp/tmp*
-rw-r--r--. 1 root root 2 Jul  9 16:18 /tmp/tmp1
-rw-r--r--. 1 root root 2 Jul  9 16:18 /tmp/tmp2
-rw-r--r--. 1 root root 2 Jul  9 16:18 /tmp/tmp3
-rw-r--r--. 1 root root 2 Jul  9 16:18 /tmp/tmp4
[vagrant@h160 ~]$ cat /tmp/tmp*
1
2
3
4
[vagrant@h160 ~]$ 

总结

构建一个简单的 web 还是非常快捷的

可以同时通过 SaveUploadedFile 方法来保存上传的文件


原文地址 http://soft.dog/2018/07/09/go-gin-09/

类似博客

评论