代码实例:
package main
import (
"bytes"
"io"
"io/ioutil"
"mime/multipart"
"net/http"
"os"
)
func main() {
form := formData{
// 提交的URL
url: `https://www.jianshu.com/u/e8934b1c83c3`,
// 非资源的字段和数据
data: []Data{
{key: `Author`, value: `海东总司`},
{key: `Time`, value: `2019-11-11 18:36:13`},
},
// 资源的字段和数据
resource: Resource{
key: `UpdateFile`, value: `测试.txt`,
},
}
// 发送请求,返回请求结果
result := updateFile(form)
println(result)
}
type formData struct {
url string
data []Data
resource Resource
}
type Data struct {
key string
value string
}
type Resource struct {
key string
value string
}
// 上传文件
// 参数:表单数据
func updateFile(form formData) string {
// 创建表单
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)
// 表单中的字段和数据(非资源文件)
for _, v := range form.data {
bodyWriter.WriteField(v.key, v.value)
}
// 表单中的字段和数据(资源文件)
fileWriter, err := bodyWriter.CreateFormFile(form.resource.key, form.resource.value)
panicErr(err)
// 获取文件
fh, err := os.Open(form.resource.value)
panicErr(err)
defer fh.Close()
// 复制到表单中
_, err = io.Copy(fileWriter, fh)
panicErr(err)
// 获取表单的 ContentType
contentType := bodyWriter.FormDataContentType()
bodyWriter.Close()
// 发送表单数据
resp, err := http.Post(form.url, contentType, bodyBuf)
resp_body, err := ioutil.ReadAll(resp.Body)
panicErr(err)
defer resp.Body.Close()
return string(resp_body)
}
// 统一处理错误函数
func panicErr(err error) {
if err != nil {
panic(err)
}
}