go | 上传文件 | tcpdump&wireshark 抓包分析

go 上传文件

go 复制代码
package main

import (
	"fmt"
	"log"

	"github.com/gin-gonic/gin"
)

/*

执行命令:
curl -X POST http://localhost:8080/upload -F "file=@/path/main.zip" -H "Content-Type:multipart/form-data"

*/
func main() {

	r := gin.Default()
	// Upload single file
	r.MaxMultipartMemory = 8 << 20

	r.POST("/upload", func(c *gin.Context) {

		file, _ := c.FormFile("file")
		log.Println(file.Filename)

		dst := "./" + file.Filename
		//上传至指定的完整文件路径
		c.SaveUploadedFile(file, dst)

		c.String(200, fmt.Sprintf("'%s' upload", file.Filename))
	})

	r.Run(":8080")

}

###启动

bash 复制代码
go run example.go

###抓包

bash 复制代码
#抓包
tcpdump -vvv -X -n -i any -s0 port 8080 -w test.pcap

###客户端请求 上传文件

接着在另个会话执行

bash 复制代码
curl -X POST http://localhost:8080/upload -F "file=@/path/main.zip" -H "Content-Type:multipart/form-data"
bash 复制代码
# 以下是抓包内容 http/1.1
HTTP/1.1 100 Continue

POST /upload HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.61.1
Accept: */*
Content-Length: 1143
Content-Type: multipart/form-data; boundary=------------------------fc4cffd8a2c2f658
Expect: 100-continue

--------------------------fc4cffd8a2c2f658
Content-Disposition: form-data; name="file"; filename="main.zip"
Content-Type: application/octet-stream

PK........F..X...!....4.......main.goUT	....
f...fux..............T.N.@.}..b.....M/..%..E...D(.J....d....%@Q..3......).......iyy.'...U.....A.GL	.O.kY...tS?.J....6'Z...X......F...."ix{a..jr.=0b.U	V8..j..IR...l_....8.sx'-....jeux........g.%i..(v:..s_;....$.'....`.,ay.&......?.9q.RR...0.M....;o.G}`..D../....o.....X..-/.o..hB&....nxc...cLIXHD.(..A_SX5...K..1.........*%..{F....Q}@.cx.	.......lp..)....nU.]............sm...V....7..jq..HC......."..
....%(./K...OV$....FTB9.k.nV...Z.r`#nX.il...=._.....)~K.._.v.R{..(Z'..J.+.
-..F..@.E.1?D.u..>.l(...[..8..75....W.Tp..	#.D.a*x%....4of..........$^.JH%.`......p2...W.....y^...Sm].....`."6.....wR..BU.({..K...6.]+
.m[.\J..Y.."+../.k(...G....d$4aA..M.Go.Nl.-..;c..].%..)
....
..0..H.`./]7+....,."w.P.#.*.....^..cWa2..-.=.'.(%....u...n\.........\M..^.A.;.(0.|.ti.'.$..k;8L..i.5.U.CafX5l.V.~....N.JX8....?.PK..........F..X...!....4.....................main.goUT.....
fux.............PK..........M...L.....
--------------------------fc4cffd8a2c2f658--
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Fri, 05 Apr 2024 12:49:59 GMT
Content-Length: 17

'main.zip' upload

上面的显示,

来一张图片,

对了,如果不用curl 方式可以在浏览器打开 html 请求服务器上传文件

html 复制代码
<!DOCTYPE html>
<html>
<body>

<h2>Upload File</h2>

<form action="http://localhost:8080/upload" method="post" enctype="multipart/form-data">
  Select file to upload:
  <input type="file" name="file" id="file">
  <input type="submit" value="Upload File" name="submit">
</form>

</body>
</html>
相关推荐
利威尔xu3 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
利威尔xu4 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
FungLeo5 小时前
成为全栈·Go 后端篇·从 Node SQLite 到 PostgreSQL:把迁移做成独立交付物
postgresql·golang·sqlite·go·数据库迁移·成为全栈
皓月盈江10 小时前
GO使用Gin框架实现模板定义、解析与渲染
linux·golang·go·gin·定义模板·解析模板·渲染模板
利威尔xu10 小时前
万字详解|Go 进阶(五):sync 包底层:Mutex 自旋 4 次转饥饿,WaitGroup 漏 1 个 Done 挂起 3000 goroutine
后端·golang·并发编程·源码分析·sync
日日大王学编程12 小时前
AI 时代后端方向新人的未来规划与看法
人工智能·后端·python·ai·golang
FungLeo12 小时前
成为全栈·Go 后端篇·Go 后端怎么测试:从成功响应到故障后置状态
golang·集成测试·差分测试·成为全栈·后端测试·数据库测试
Sw1zzle12 小时前
Go入门(零):Linux Ubuntu 22.04 安装 Go
linux·ubuntu·golang
码剑客14 小时前
Gin+GORM+Redis 项目开发常见性能坑汇总(Go后端避坑指南)
redis·后端·golang·gin
FungLeo14 小时前
成为全栈·Go 后端篇·换后端不改前端:四个客户端如何做兼容回归
flutter·golang·go·成为全栈·兼容测试·taro 小程序