📙Go语言:进阶大全

Go语言:模拟表单Form上传资源(封装类)

2019-11-11  本文已影响0人  白祤星

代码实例:


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)
    }
}
上一篇下一篇

猜你喜欢

热点阅读