前面我们学习了在表单中如何上传文件: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