go实践二十--1 web开发--模拟表单上传文件

前面我们学习了在表单中如何上传文件:https://blog.csdn.net/daily886/article/details/100558802

现在我们模拟客户端提交表单数据和文件

新建一个 testformupload.go 文件,内容如下:

package main

import (
	"bytes"
	"fmt"
	"io"
	"io/ioutil"
	"mime/multipart"
	"net/http"
	"os"
	"time"
	"crypto/md5"
	"strconv"
)

func postFile(filename string, targetUrl string) error {
	bodyBuf := &bytes.Buffer{}
	bodyWriter := multipart.NewWriter(bodyBuf)

	//加入token
	curtime := time.Now().Unix()
	h := md5.New()
	io.WriteString(h,strconv.FormatInt(curtime,10))
	token := fmt.Sprintf("%x",h.Sum(nil)) //生成token
	//模拟表单数据
	_ = bodyWriter.WriteField("token", token)
	_ = bodyWriter.WriteField("username", "awef")
	_ = bodyWriter.WriteField("password", "password")
	_ = bodyWriter.WriteField("age", "3")
	_ = bodyWriter.WriteField("email", "123@qq.com")
	_ = bodyWriter.WriteField("mobile", "12312345678")
	_ = bodyWriter.WriteField("sex", "1")
	_ = bodyWriter.WriteField("interest", "football")
	_ = bodyWriter.WriteField("usercard", "123456789123456123")

	//关键的一步操作 ,模拟上传文件
	fileWriter, err := bodyWriter.CreateFormFile("userheader", filename)
	if err != nil {
		fmt.Println("error writing to buffer")
		return err
	}

	//打开文件句柄操作
	fh, err := os.Open(filename)
	if err != nil {
		fmt.Println("error opening file")
		return err
	}
	defer fh.Close()

	//iocopy
	_, err = io.Copy(fileWriter, fh)
	if err != nil {
		return err
	}

	contentType := bodyWriter.FormDataContentType()
	bodyWriter.Close()

	resp, err := http.Post(targetUrl, contentType, bodyBuf)
	if err != nil {
		return err
	}
	defer resp.Body.Close()
	resp_body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return err
	}
	fmt.Println(resp.Status)
	fmt.Println(string(resp_body))
	return nil

	//上面的例子详细展示了客户端如何向服务器上传一个文件的例子,客户端通过multipart.Write把文件的文本流写入一个缓存中,然后调用http的Post方法把缓存传到服务器。

	//如果你还有其他普通字段例如username之类的需要同时写入,那么可以调用multipart的WriteField方法写很多其他类似的字段。
}

// sample usage
func main() {
	target_url := "http://127.0.0.1:6665/info"
	filename := "./testformupload.go"
	postFile(filename, target_url)
}

运行该文件,可以看到该文件的最后修改日期已更新:

[root@izj6c4jirdug8kh3uo6rdez goweb]# go run testformupload.go
200 OK
token验证通过

hello,<script>alert('you have been pwned')</script>!
hello,<script>alert('you have been pwned')</script>!
hello,<script>alert('you have been HTML')</script>!map[Content-Disposition:[form-data; name="userheader"; filename="./testformupload.go"] Content-Type:[application/octet-stream]]


[root@izj6c4jirdug8kh3uo6rdez goweb]# ll
total 96
-rwxr-xr-x 1 root root 61077 Sep  5 15:20 a435c26724359a53730a52d919f106a4.png
-rw-r--r-- 1 root root  2447 Sep  5 15:43 testform1.go
-rw-r--r-- 1 root root   529 Sep  5 15:43 testform1.gtpl
-rw-r--r-- 1 root root  8466 Sep  5 15:43 testform2.go
-rw-r--r-- 1 root root  1487 Sep  5 15:43 testform2.gtpl
-rw-r--r-- 1 root root  2157 Sep  5 15:44 testformupload.go
-rw-r--r-- 1 root root   388 Sep  5 15:43 testmux.go
-rw-r--r-- 1 root root   783 Sep  5 15:43 testparseform.go

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值