为了账号安全,请及时绑定邮箱和手机立即绑定

golang解析http multipart/form的三种方式

标签:
Go


multipart/form-data 顾名思义可以上传多个form-data 并且用分隔符进行分割,多用于文件上传

1. http  multipart/form-data 请求样例

POST /handle HTTP/1.1 

Host: localhost:8080 

Connection: keep-alive 

Content-Length: 182537 

Cache-Control: max-age=0 

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryWdDAe6hxfa4nl2Ig

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 

Accept-Encoding: gzip, deflate, br 

Accept-Language: zh-CN,zh;q=0.9

------WebKitFormBoundaryWdDAe6hxfa4nl2Ig

Content-Disposition: form-data; name="submit-name"

jack

------WebKitFormBoundaryWdDAe6hxfa4nl2Ig

Content-Disposition: form-data; name="file1"; filename="out.png"

Content-Type: image/png

binary-data

------WebKitFormBoundaryWdDAe6hxfa4nl2Ig

Content-Disposition: form-data; name="file2"; filename="2.png"

Content-Type: image/png

binary-data-2

------WebKitFormBoundaryWdDAe6hxfa4nl2Ig--

2. golang解析示例

package main

import (

"bytes"

"net/http"

"io/ioutil"

"fmt"

"mime/multipart"

"io"

)

func main() {

bodyBuf := bytes.NewBuffer(nil)

bodyBuf.WriteString(`------WebKitFormBoundaryWdDAe6hxfa4nl2Ig

Content-Disposition: form-data; name="submit-name"

xiongwei

------WebKitFormBoundaryWdDAe6hxfa4nl2Ig

Content-Disposition: form-data; name="file1"; filename="out.png"

Content-Type: image/png

binary-data

------WebKitFormBoundaryWdDAe6hxfa4nl2Ig

Content-Disposition: form-data; name="file2"; filename="2.png"

Content-Type: image/png

binary-data-2

------WebKitFormBoundaryWdDAe6hxfa4nl2Ig--`)

req := &http.Request{

Method: "POST",

Header: http.Header{"Content-Type": {`multipart/form-data; boundary=----WebKitFormBoundaryWdDAe6hxfa4nl2Ig`}},

Body:   ioutil.NopCloser(bodyBuf),

}

getMultiPart3(req)

}

//通过r.ParseMultipartForm

func getMultiPart1(r *http.Request)  {

/**

底层通过调用multipartReader.ReadForm来解析

如果文件大小超过maxMemory,则使用临时文件来存储multipart/form中文件数据

*/

r.ParseMultipartForm(128)

fmt.Println("r.Form:         ",r.Form)

fmt.Println("r.PostForm:     ",r.PostForm)

fmt.Println("r.MultiPartForm:",r.MultipartForm)

getFormData(r.MultipartForm)

}

//通过MultipartReader

func getMultiPart2(r *http.Request)()  {

mr,err := r.MultipartReader()

if err != nil{

fmt.Println("r.MultipartReader() err,",err)

return

}

form ,_ := mr.ReadForm(128)

getFormData(form)

}

//字节解析multi-part

func getMultiPart3(r *http.Request)()  {

mr,err := r.MultipartReader()

if err != nil{

fmt.Println("r.MultipartReader() err,",err)

return

}

for{

p ,err := mr.NextPart()

if err == io.EOF{

break

}

if err != nil{

fmt.Println("mr.NextPart() err,",err)

break

}

fmt.Println("part header:",p.Header)

formName := p.FormName()

fileName := p.FileName()

if formName != "" && fileName == ""{

formValue,_:= ioutil.ReadAll(p)

fmt.Printf("formName:%s,formValue:%s\n",formName,formValue)

}

if fileName != "" {

fileData,_:=ioutil.ReadAll(p)

fmt.Printf("fileName:%s,fileData:%s\n",fileName,fileData)

}

fmt.Println()

}

}

func getFormData(form *multipart.Form)  {

//获取 multi-part/form body中的form value

for k,v := range form.Value{

fmt.Println("value,k,v = ",k,",",v)

}

fmt.Println()

//获取 multi-part/form中的文件数据

for _,v := range form.File {

for i:=0 ;i < len(v);i++{

fmt.Println("file part ",i,"-->")

fmt.Println("fileName   :",v[i].Filename)

fmt.Println("part-header:",v[i].Header)

f,_ := v[i].Open()

buf,_:= ioutil.ReadAll(f)

fmt.Println("file-content",string(buf))

fmt.Println()

}

}

}

image.png

©著作权归作者所有:来自51CTO博客作者暮色伊人的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消